hdu1028(母函数应用)

来源:互联网 发布:德国骨科 知乎 编辑:程序博客网 时间:2024/06/01 07:31

题目要求:给定整数n,求n有多少种划分方式。(对于4来说,1+3和3+1是同一种划分方式)

题目思路:就是简单的母函数应用。对于整数n,可令G(x)=(1+x+x^2+x^3+...+x^n)(1+x^2+x^4+...)(1+x^3+x^6...)...

1+x+x^2+x^3+...+x^n的第i位x^i表示1取i次的情况,(1+x^2+x^4+...)的第i位表示2取i次的情况,依次类推。

母函数的其它应用:有1克、2克、3克、4克的砝码各一枚,能称出哪几种重量?每种重量各有几种可能方案?

令G(x)=(1+x)(1+x^2)(1+x^3)(1+x^4),(1+x^i)只有两项分别代表取或不取i克砝码,最终g(x)去括号后的系数对应方案数。

ac代码:

#include<iostream>using namespace std;const int maxn=123;int c1[123],c2[123];int main(){int n;while(~scanf("%d",&n)){//(1+x+x^2+x^3+x^4+...)(1+x^2+x^4+...)(1+x^3+x^6+...)for(int i=0;i<=n;i++){c1[i]=1;c2[i]=0;}for(int i=2;i<=n;i++){//表示第i个多项式for(int j=0;j<=n;j++)//前i-1个多项式去括号后肯定是n+1项,枚举之 for(int k=0;j+k<=n;k+=i)//枚举第i个多项式 c2[j+k]+=c1[j];//因为第i个多项式的系数初值为1,所以c2[]={0}                         for(int j=0;j<=n;j++){c1[j]=c2[j];c2[j]=0;}}printf("%d\n",c1[n]);}return 0;} 
ps:11点啦,不敲了,打了半天比赛,真累(睡觉)。明天会进一步理解母函数。

原创粉丝点击