刚刚看了杭电的acm的ppt,里面有一讲的主题是母函数。开始并没有理解母函数的用处,知道后面看到那个例子,顿时感觉这个构造函数的方法真是巧妙。
问题描述:若有1克、2克、3克、4克的砝码各一枚,能称出哪几种重量?各有几种可能方案?
初看这题,感觉应该用枚举吧,当然这题的数据很简单,但是当数据量大到一定程度时这么做是很慢的。一种巧妙的做法就是构造母函数,做法如下:
1个1克的砝码可以用函数1+x表示,
1个2克的砝码可以用函数1+x2表示,
1个3克的砝码可以用函数1+x3表示,
1个4克的砝码可以用函数1+x4表示。
这样一来,只需通过计算 (1+x)(1+x2)(1+x3)(1+x4) = 1+x+x2+2x3+2x4+2x5+2x6+2x7+x8+x9+x10 就能得出这样一个结论:用这4个砝码可以称出1克到10克的所有重量,而对应项的系数就是相应的方案数。
这样看来,母函数的使用可以大大简化对整数拆分类题目分析的难度。而问题的关键就在于如何用程序实现多项式乘积的展开,从而得到对应的方案数。
下面的程序用来计算 G(x) = (1+x+x2+...)(1+x2+x4+...)(1+x3+x6+...)... 这个算式中指数为n的项的系数。
View Code
1 int c1[N],c2[N];
2
3 int genFun(int n)
4 {
5 for(int i=0;i<=n;i++)
6 {
7 c1[i] = 1;
8 c2[i] = 0;
9 }
10 for(int i=2;i<=n;i++)
11 {
12 for(int j=0;j<=n;j++)
13 for(int k=0;k<=n-j;k+=i)
14 c2[j+k] += c1[j];
15 for(int j=0;j<=n;j++)
16 {
17 c1[j] = c2[j];
18 c2[j] = 0;
19 }
20 }
21 return c1[n];
22 }