Alice and Bob
Description
Alice and Bob like playing
games very much.Today, they introduce a new game.
There is a polynomial like
this: (a0*x^(2^0)+1) * (a1 *
x^(2^1)+1)*.......*(an-1 * x^(2^(n-1))+1). Then Alice ask Bob Q
questions. In the expansion of the Polynomial, Given an integer P, please tell
the coefficient of the x^P.
Can you help Bob answer
these questions?
Input
The first line of the input
is a number T, which means the number of the test cases.
For each case, the first
line contains a number n, then n numbers a0, a1, ....
an-1 followed in the next line. In the third line is a number Q, and
then following Q numbers P.
1 <= T <=
20
1 <= n <=
50
0 <= ai <=
100
Q <=
1000
0 <= P <=
1234567898765432
Output
For each question of each
test case, please output the answer module 2012.
Sample
Input
1
2
2 1
2
3
4
Sample
Output
2
0
HINT
The expansion of the
(2*x^(2^0) + 1) * (1*x^(2^1) + 1) is 1 + 2*x^1 + 1*x^2 +
2*x^3
题目大意:多项式相乘,写几项就发现规律了。
(a0x+1)(a1x^2+1)(a2x^4+1)
=a0a1a2x^7+a1a2x^6+a0a2x^5+a2x^4+a0a1x^3+a1x^2+a0x+1
列出来后发现正好该数化为二进制(不用逆置),如果为1,则相乘
7:a0a1a2
即1+2+4
6:a1a2
即2+4
5:a0a2
即1+4
4:a2
即4
3:a0a1
即1+2
2:a1
即2
1:a0
即1
0:1
可以看出,对应为:
a3 a2 a1
a0
8 4
2 1
1 #include <iostream>
2 #include<cstdio>
3 #include<string.h>
4 using namespace std;
5
6 #define maxn 105
7
8 int a[maxn],pos[maxn];
9
10 int main()
11 {
12 int t,n,i,j,q,ans;
13 long long p;//因为0 <= p <= 1234567898765432
14 scanf("%d",&t);
15 while(t--)
16 {
17 scanf("%d",&n);
18 memset(a,0,sizeof(a));//这个很妙,比如n=3,则p>=8以后都要=0,就靠这一句
19 for(i=0;i<n;i++)
20 {
21 scanf("%d",&a[i]);
22 }
23 scanf("%d",&q);
24 while(q--)
25 {
26 scanf("%lld",&p);
27 if(p==0)
28 {
29 printf("1\n");//别忘了
30 continue;
31 }
32 memset(pos,0,sizeof(pos));
33 i=0;
34 while(p)
35 {
36 pos[i++]=p%2;//求p转化为二进制
37 p/=2;
38 }
39 ans=1;
40 for(j=0;j<i;j++)
41 {
42 if(pos[j])//如果那一位二进制=1
43 {
44 ans=ans*a[j]%2012;//则就是那几位相乘,一边乘一遍取余2012
45 }
46 }
47 printf("%d\n",ans);
48 }
49 }
50 return 0;
51 }
△2013山东省ACM竞赛-Alice and Bob,布布扣,bubuko.com