第4回acm F題(Alice and Bob)(巧みにバイナリを使う)
1333 ワード
タイトル接続:http://acm.upc.edu.cn/problem.php?cid=1109&pid=5
こんな(a 0*x^(2^0)+1)*(a 1*x^(2^1)+1)*.......*(an-1*x^(2^(n-1))+1)多項式、各多項式の係数aはユーザが入力し、項数nもユーザが入力し、次に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である.
こんな(a 0*x^(2^0)+1)*(a 1*x^(2^1)+1)*.......*(an-1*x^(2^(n-1))+1)多項式、各多項式の係数aはユーザが入力し、項数nもユーザが入力し、次に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
",ans);
}
}
return 0;
}