题意:多项式相乘,(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
#include <iostream>
#include<cstdio>
#include<string.h>
using namespace std; #define maxn 105 int a[maxn],pos[maxn]; int main()
{
int t,n,i,j,q,ans;
long long p;//因为0 <= p <= 1234567898765432
scanf("%d",&t);
while(t--)
{
scanf("%d",&n);
memset(a,,sizeof(a));//这个很妙,比如n=3,则p>=8以后都要=0,就靠这一句
for(i=;i<n;i++)
{
scanf("%d",&a[i]);
}
scanf("%d",&q);
while(q--)
{
scanf("%lld",&p);
if(p==)
{
printf("1\n");//别忘了
continue;
}
memset(pos,,sizeof(pos));
i=;
while(p)
{
pos[i++]=p%;//求p转化为二进制
p/=;
}
ans=;
for(j=;j<i;j++)
{
if(pos[j])//如果那一位二进制=1
{
ans=ans*a[j]%;//则就是那几位相乘,一边乘一遍取余2012
}
}
printf("%d\n",ans);
}
}
return ;
}