整数划分问题,,用到了五边形定理,,还不懂怎么处理的,先记下。。
#include<stdio.h> #include<string.h> #include<math.h> #define N 100010 #define MOD 1000000007 #define LL long long int w[N]; LL f[N]; int main(){ w[0]=0; for(int k=1,i=1;w[k-1]<=100000;i++){ w[k++]=(3*i*i-i)/2; w[k++]=(3*i*i+i)/2; } f[0]=1; for(int i=1;i<=100000;i++){ f[i]=0; for(int j=1;w[j]<=i;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; } } int cas; int n ; scanf("%d",&cas); while(cas--) { scanf("%d",&n); printf("%I64d\n",(f[n]+MOD)%MOD); } return 0; }