Andy的作业 FZU - 1404 (结果为大数的乘法)

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;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值