第四届acm F题(Alice and Bob)(巧用二进制)

题目连接:http://acm.upc.edu.cn/problem.php?cid=1109&pid=5

大意是 给你一个这样(a0*x^(2^0)+1) * (a1 * x^(2^1)+1)*.......*(an-1 * x^(2^(n-1))+1)多项式,每个多项式的系数a由用户输入,项数n也是由用户输入,接下来输入一个q,下面有q行个p,表示x^p的,请你输出x^p的系数mod 2012

首先这个不要直接展开多项式,复杂度为2^n,会超时,并且也没法保存。

系数P是由Ai*x^(2^i)+1中的2^i组成,可以把P看成2进制的数,P对应二进制中1的位置表示ai这个位置要被用,这样才能组成这个P

同时,这里要判断P这个数的二进制的位数是否超过了n,如果i>=n是,ans=0

#include<stdio.h>
#include<string.h>
#define mod 2012
int main()
{
    long long p;
    int a[55],n,i,q;
    int t;
    int flag;
    int ans;
    scanf("%d",&t);
    while(t--)
    {
        memset(a,0,sizeof(0));
        scanf("%d",&n);
        for(i=0;i<n;i++)
            scanf("%d",&a[i]);
        scanf("%d",&q);
        while(q--)
        {
            ans=1;i=0;
            flag=1;
            scanf("%lld",&p);
            while(p)
            {
                if(i>=n)
                {
                    ans=0;break;
                }
                if(p%2==1)
                {
                    ans*=a[i];
                    ans%=mod;
                }
                i++;
                p/=2;
            }
            printf("%d\n",ans);

        }
    }
    return 0;
}


你可能感兴趣的:(第四届acm F题(Alice and Bob)(巧用二进制))