题目地址: http://acm.hdu.edu.cn/showproblem.php?pid=2189
该题主要是将每一项素数作为基地,知道系数>150
例如:
(1+x^2+x^4+...+x^150)(1+x^3+x^6+...+x^150)(1+x^5+x^10+...+x^150)...(1+x^149)
注意每一项系数都是素数,然后乘倍增加,直到>150
代码入下:
#include <iostream> #include <cstdio> #include <cstdlib> #include <cmath> #include <cstring> #include <string> #include <algorithm> #include <vector> #include <set> #include <map> #include <queue> using namespace std; /* freopen("input.txt", "r", stdin); //读数据 freopen("output.txt", "w", stdout); //注释掉此句则输出到控制台 */ int prime[151],num[151]; int a[151],b[151]; int main() { int i,j,l,tt,n; memset(num,0,sizeof(num)); int k=1; for(i=2;i<=150;i++) if(num[i]==0) { prime[k++]=i; for(j=i+i;j<=150;j+=i) num[j]=1; } prime[k]=250;//这个地方一定要赋值,不然下面k=prime[i]最后会变成0,无限循环 memset(a,0,sizeof(a)); for(i=0;i<=150;i=i+2) a[i]=1; for(i=2,k=prime[i];k<=150;k=prime[i])//这个地方就是取素数赋值给k,当k>150结束 { memset(b,0,sizeof(b)); for(j=0;j<=150;j++)//a数组 { if(a[j]==0)//为0直接跳过 continue; for(l=0;j+l<=150;l+=k)//不为0则a的每一位与素数k的函数相乘,知道>150,结果放在b数组中 { b[j+l]+=a[j]; } } for(j=0;j<=150;j++) a[j]=b[j]; i++; } cin>>tt; while(tt--) { scanf("%d",&n); printf("%d\n",a[n]); } return 520; }