题目大意:给出数n,求由比数n相加的和为n的加法的种类,每个数可用多次,交换顺序为同一种加法
解题思路:母函数模板
G( x ) = (1 + x + x^2 +····) * ( 1 + x^2 + x^4 + ····) * ( 1 + x^3 + x^6+....)*......
#include <bits/stdc++.h>
using namespace std;
const int maxn = 10001;
int c1[maxn],c2[maxn];// c1是保存可以相加构成数n的种数 ,c2是中间量,保存每一次的情况
int main()
{
int nNum;
while(scanf("%d",&nNum) != EOF)
{
for(int i=0; i<=nNum; i++) //初始化数n的构成有1种(第一条表达式的初始化)
{
c1[i] = 1;
c2[i] = 0;
}
for(int i=2; i<=nNum; i++)//对于第2个表达式到第n个表达式
{
for(int j=0; j<=nNum; j++)//对于第j个变量(x^j)
{
for(int k=0; k+j<=nNum; k+=i) //对于第i个表达式的每个变量
{
c2[j+k] += c1[j];
}
}
for(int j=0; j<=nNum; j++)//对于每条表达式从0开始
{
c1[j] = c2[j];
c2[j] = 0;
}
}
printf("%d\n",c1[nNum]);
}
return 0;
}