Description
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<iostream>
#include<algorithm>
#include<math.h>
#include<cstdio>
#include<string>
#include<string.h>
using namespace std;
const int maxn = 200;
const int base = 100000000;
struct bignum
{
int len, s[maxn];
bignum() { memset(s, 0, sizeof(s)); len = 1; }
bignum operator = (const bignum &b)
{
len = b.len;
memcpy(s, b.s, maxn*sizeof(int));
return *this;
}
};
bignum operator *(const bignum &a, const int &b)
{
bignum c;
if (b == 0) return c;
long long jw = 0, i;
for (i = 0; i < a.len || jw>0; i++)
{
if (i < a.len) jw += (long long)a.s[i] * b;
c.s[i] = jw % base; jw /= base;
}
c.len = i; return c;
}
int a[1000];
int main(){
int n, m, l, r;
while (~scanf("%d%d", &n, &m))
{
for (int i = 1; i <= n; i++) scanf("%d", &a[i]);
while (m--)
{
scanf("%d%d", &l, &r);
bignum f;
f.s[0] = 1; int ff = 0;
for (int i = l; i <= r; i++)
if (a[i] > 0) f = f*a[i];
else { f = f*(-a[i]); ff = 1 - ff; }
if (ff && (f.len > 1 || f.s[0] != 0)) printf("-");
printf("%d", f.s[f.len - 1]);
for (int i = f.len - 2; i >= 0; i--) printf("%08d", f.s[i]);
cout << endl;
if (!m) printf("Homework Finished\n");
}
}
return 0;
}