该题课构造母函数:
1分:f1(x)=1+x+x^2+x^3+...+x^n;
2分:f2(x)=1+x^2+x^4+x^6+...+x^(2*n);
3分:f3(x)=1+x^3+x^6+x^9+...+x^(3*n);
n->∞;
母函数g(x)=f1(x)*f2(x)*f3(x);
其中,每一项a*x^b:
a为组合出b分钱的方法数。
在此题中,1分用单位指数为1来表示(便于理解,自己起的名字)
此题的a值都默认为1。
int c1[MAX],c2[MAX];
int main()
{
int i,k,j,n;
for(i=0;i<=MAX;i++)<span style="white-space:pre"> //单位指数为1的时候
{
c1[i]=1;
c2[i]=0;
}
for(i=2;i<=3;i++)<span style="white-space:pre"> //单位指数分别为2,3的时候
{
for(j=0;j<=MAX;j++)<span style="white-space:pre"> //遍历前一个多项式
{
for(k=0;k+j<MAX;k+=i)<span style="white-space:pre"> //遍历后一个多项式
c2[j+k]+=c1[j];<span style="color:#33cc00;"> //把结果存在C2[]中,c1[]为前i-1多项式的乘积结果(也是一个多项式
}
}
for(j=0;j<=MAX;j++)
{
c1[j]=c2[j];<span style="white-space:pre"> //把结果赋值给c1[],便于循环
c2[j]=0;<span style="white-space:pre"> </span>
}
}
while(scanf("%d",&n)!=EOF)
printf("%d\n",c1[n]);
return 0;
}