这题显然是数学题,整数拆分问题,要用到五边形定理。
其中,f(n)=求和((-1)^(k-1)*f(n-k*(3*k-1)/2))+求和((-1)^(k-1)*f(n-k*(3*k+1)/2)),其中保证k>=1,且n-k*(3*k-1)/2>=0,n-k*(3*k+1)/2>=0, 并且f(0)=1。
关于如何推出这个公式的,我就不清楚了。
#include <iostream>
#include <fstream>
#include <algorithm>
#include <cstring>
using namespace std;
#define N 100000
#define T 1000000007
long long p[N+5];
int main()
{
freopen("1.in","r",stdin);
freopen("1.out","w",stdout);
p[0] = p[1] =1;
for (int i=2;i<=N;i++){
int k=1;
int flag=1;
while ((k*(3*k-1))/2<=i){
p[i]+=flag*p[i-(k*(3*k-1))/2];
if (p[i]>=T) p[i]%=T;
if (p[i]<0) p[i]+=T;
flag*=-1;
k++;
}
k= flag = 1;
while ((k*(3*k+1))/2<=i){
p[i]+=flag*p[i-(k*(3*k+1))/2];
if (p[i]>=T) p[i]%=T;
if (p[i]<0) p[i]+=T;
flag*=-1;
k++;
}
// cout<<p[i]<<',';
}
int n;
cin>>n;
for (int i=0;i<n;i++){
int j;
scanf("%d",&j);
printf("%d\n",p[j]);
}
return 0;
}