FZU 1404 Andy的作业

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;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值