http://zh.wikipedia.org/wiki/%E6%95%B4%E6%95%B8%E5%88%86%E6%8B%86
http://zh.wikipedia.org/wiki/%E5%BB%A3%E7%BE%A9%E4%BA%94%E9%82%8A%E5%BD%A2%E6%95%B8
由这两个,学到两个公式,然后就可以直接做了
一、广义五边形数
Qn为(3*n*n-n)/2和(3*n*n+n)/2,不要惊讶,Qn就是两个数。
Q1=1,2
Q2=5,7
Q3=12,15
二、分割函数
其中qi为广义五边形数
n-qi当然要大于0,这作为内层循环停止的条件,下面贴代码:
#include<cstdio>
using namespace std;
#define LL long long
#define N 100001
#define Mod 1000000007
LL ans[N];
void init()
{
int f=-1,i,j,w;
ans[0]=1;
ans[1]=1;
ans[2]=2;
for(i=3;i<N;i++)
{
for(j=1;;j++)
{
w=(3*j*j-j)/2;
if(w>i)break;
if(j%2)ans[i]=(ans[i]+ans[i-w])%Mod;
else ans[i]=(ans[i]-ans[i-w]+Mod)%Mod;
w=(3*j*j+j)/2;
if(w>i)break;
if(j%2)ans[i]=(ans[i]+ans[i-w])%Mod;
else ans[i]=(ans[i]-ans[i-w]+Mod)%Mod;
}
}
}
int main()
{
int t,n;
init();
scanf("%d",&t);
while(t--)
{
scanf("%d",&n);
printf("%d\n",ans[n]);
}
return 0;
}