省赛13 Alice and Bob(二进制,找规律)

题意:多项式相乘,(a0x+1)(a1x^2+1)(a2x^4+1),问x的m次方的系数是多少,当时没做出来,搜的某大神的博客,好理解。

思路:多列几个式子就能明白规律了:

(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

 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
");//别忘了
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
",ans);
48         }
49     }
50     return 0;
51 }
View Code
原文地址:https://www.cnblogs.com/ACMERY/p/4486078.html