题意:将数字n分解,求p(n)得个数。
听说很多人都在看这个:点击打开链接
我也不多说了:
#include<stdio.h>
#define mod 1000000007
__int64 f[100005];
int w[100005];
int main()
{
int p=1,t,n;
w[0]=0;
for(int i=1;w[p-1]<=100000;i++){
w[p++]=i*(3*i-1)/2;
w[p++]=i*(3*i+1)/2;
}
f[0]=1;
for(int i=1;i<=100000;i++){
f[i]=0;
for(int j=1;i>=w[j];j++){
if(((j-1)>>1)&1) f[i]=(f[i]-f[i-w[j]])%mod;
else f[i]=(f[i]+f[i-w[j]])%mod;
}
}
scanf("%d",&t);
while(t--){
scanf("%d",&n);
printf("%I64d\n",(f[n]+mod)%mod); //f数组中保存的数有负数。
}
return 0;
}