题意:给出n n<=120,拆分n的方法数?
(1+x^2+x^3+..x^n) *(1+x^2+x^4+x^6+...) *(1+x^3+x^6+...) 第i个表达式代表了数i的选法:1代表不选i,1后的第j项(x^(ji))表示选j个i,求x^n的系数即可
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=2e3+20;
int c1[N],c2[N];//c1之前表达式累乘得到的系数 ,c2两个表达相乘的临时系数
int fun(int n)
{
for(int i=0;i<=n;i++)
{
c1[i]=1;//第一个表达式的系数 (1+x+x^2+...x^n)
c2[i]=0;
}
for(int i=2;i<=n;i++)//1~i表达式的x^系数
{
for(int j=0;j<=n;j++)//累乘的x^j系数
{
for(int k=0;k+j<=n;k+=i)//(1+x^i+x^2i+x^3i+...)
{
c2[j+k]+=c1[j];
}
}
for(int t=0;t<=n;t++)//更新x^t
{
c1[t]=c2[t];
c2[t]=0;
}
}
return c1[n];
}
int main()
{
int n;
while(cin>>n)
{
cout<<fun(n)<<endl;
}
return 0;
}