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

来源:互联网 发布:苏打饼干 知乎 编辑:程序博客网 时间:2024/06/02 04:39

题目连接: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 2012int 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;}


0 0