Andy每天都有很多作业要做,他的老师总是在说“这些作业你明天必须交上来……”。现在他找你帮忙做其中的一项作业,给出N个整数A1, A2, …, AN,有 M 个询问 q (L, R),对于每个询问,你要输出一个整数,第L个数到第R个数的乘积,这个乘积不会超过1000位。
Input
输入包含多组测试数据。每组数据第一行为两个整数N,M (N <= 800, M <= 1000) 接下来N行,给出这N个整数。然后M行,每行两个整数L R表示一个询问。
Output
对于每个询问,输出相应的结果。当所有询问结束之后输出“Homework Finished”。
Sample Input
10 5
9
7
9
6
4
9
5
8
3
4
5 9
3 8
8 10
10 10
1 7
1 1
1
1 1
Sample Output
4320
77760
96
4
612360
Homework Finished
1
Homework Finished
数组模拟乘法,考虑有0存在的结果,考虑溢出
#include<cstdio>
#include<cstring>
#include<cmath>
#include<cstdlib>
#include<queue>
#include<algorithm>
#define ll long long
#define inf 0x3f3f3f3f
#define maxn 10010
#define MOD 10000
using namespace std;
ll a[1010];
ll ans[maxn];
void solve(int x,int y)
{
for(int i=x;i<=y;i++)
if(a[i]==0)
{
printf("0\n");
return ;
}
memset(ans,0,sizeof(ans));
ans[0]=1;
int cnt=1;
ll tmp,carry;
for(int i=x;i<=y;i++)
{
carry = 0;
for(int j=0;j<cnt;j++)
{
tmp = ans[j]*a[i]+carry;
carry = tmp / MOD;
ans[j]= tmp % MOD;
}
while(carry)
{
ans[cnt++] = carry % MOD;
carry /= MOD;
}
}
for(int i=cnt-1;i>=0;i--)
printf("%lld",ans[i]);
printf("\n");
}
int main()
{
int n,m;
while(~scanf("%d%d",&n,&m))
{
for(int i=0;i<n;i++)
scanf("%lld",&a[i]);
int x,y;
for(int i=0;i<m;i++)
{
scanf("%d%d",&x,&y);
solve(x-1,y-1);
}
printf("Homework Finished\n");
}
return 0;
}