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