首页 > 代码库 > △2013山东省ACM竞赛-Alice and Bob

△2013山东省ACM竞赛-Alice and Bob

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 }