题目链接
计算整数划分个数,即经典的母函数使用题目。
对于母函数,也是各种查阅资料了一番。但是还是不太能理解,但总算会使用模版解题了~~~囧。
具体怎样解这种题目,看到一篇很不错文章,大家可以参考下:
http://blog.csdn.net/zhuangjingyang/article/details/37939569
下面是我用模版改的代码~其实也没改什么:
#include <iostream> using namespace std; const int MAXNUM = 128; //最大次数不可过大否则超时 unsigned long a[MAXNUM]; unsigned long b[MAXNUM]; unsigned long c[MAXNUM]; //两个多项式进行乘法,系数分别保存在a和b中,结果保存到c,项的最大次数到MAXNUM void Poly() { int i,j; memset(c,0,sizeof(c)); for(i=0;i < MAXNUM ; i++) for(j=0;j<MAXNUM - i;j++) //j < MAXNUM - i,确保i+j不越界 c[i + j] += a[i]*b[j]; } //计算前N项的系数,即g(x,1)*g(x,2)*....*g(x,n)的展开结果 void Init(int m) { int i,j; memset(a, 0, sizeof(a)); memset(c, 0, sizeof(c)); //第一个多项式:g(x) = x^0 + x^1 + x^2 + ... + x^n for(i = 0; i < MAXNUM; i++) a[i] = 1; for(j = 2; j <= m; j++) { memset(b, 0, sizeof(b)); //第i个多项式:g(x) = x^0 + x^i + x^(2k) + ... for(i = 0; i <= MAXNUM; i += j) b[i] = 1; //多项式相乘:c = a * b Poly(); //将结果c保存到a中 memcpy(a, c, sizeof(c)); } } int main() { int n; while(cin>>n) { Init(n); cout<<a[n]<<endl; } return 0; }