【学习笔记】多项式 4:生成函数
生成函数 GF
定义
定义一个数列 \(\{a_n\}\) 的生成函数(或母函数)\(F(x)\) 为:
这是个无限项的形式幂级数,然而我们实际上只关心有限项。
\(x\) 并没有实际意义,只是占位符。这种情况在最初的多项式卷积中就已经见到过了。
将一般的卷积写成生成函数的好处在于方便进一步推导。
简单数列的生成函数
- \(\{1,1,1,1,1,\cdots\}\)
- \(\{0,1,2,4,8,\cdots\}\)
- \(\{1,0,1,0,1,\cdots\}\)
- \(\{0,1,0,1,0,\cdots\}\)
斐波那契数列生成函数
对于 \(n\ge 2\),有:
于是可以写成:
然而边界值不能确定,只需要补足 \([x^1]F(x)=1\) 即可,于是:
整理一下变成:
设 \(\dfrac{x}{1-x-x^2}=\dfrac{A}{1-ax}+\dfrac{B}{1-bx}\)
根据上面的举例,可以知道左右两个分式都能写成等比的生成函数,于是:
这个就是斐波那契数列的通项公式了。
普通生成函数 OGF
用于无标号计数。
形式
当 \(a_i=k^i\) 时,封闭形式:
一个简单的例子
有红黄蓝三种球各 \(m\) 个,从中共选出 \(n\) 个,求方案数。
构造生成函数 \(G(x)=1+x+x^2+\cdots+x^m\),三种球的选择实际上就是乘积贡献到指数和的位置,也就是卷积,于是可以写成:
生成函数的形式就是:
范德蒙德卷积
左侧是 \([x^k](1+x)^{n+m}\),右侧是 \([x^i](1+x)^n\times [x^{k-i}](1+x)^m\)
这样一看好像很显然了。
一道题
CodeForces-438E The Child and Binary Tree *3100
设 \(g_i\) 为该权值是否在集合中,\(f_i\) 为权值和为 \(i\) 的方案数,写出转移式子:
就是三个函数卷一下,但是重要的地方在于初始值 \(f_0=1\),于是生成函数应该写成:
解一下:
分子有理化:
\(G=0\) 时加号有意义,因此是:
卡特兰数生成函数
卡特兰数的一个递推式:
也就是:
解完和上一题差不多,是:
据说再解就出通项了。
指数生成函数 EGF
用于有标号计数。
形式
\(a_i=1\) 的特殊情况:
因此 \(a_i=k^i\) 时:
一个简单的例子
还是红黄蓝三种球,只不过这次是要出一个排列。
拆开组合数很神奇的是:
长得很像,同样也是:
一道题
常规容斥做法不多赘述。
设 \(F(x)\) 为无向连通图个数的生成函数,那么 \(F(x)\) 卷多次得到:
除以一个 \(i!\) 是因为连通块没有顺序区别,而 \(F(x)\) 卷积是有顺序区别的。
这个东西和 \(e^x\) 的泰勒展开很像,也就是:
而 \(G(x)=\sum_{i\ge 0} 2^{\tbinom{i}{2}}x^i\) 是已知的,\(\ln G(x)=F(x)\) 回来即可。
多项式 \(\exp\) 与多项式 \(\ln\) 的组合意义
通过上面的题实际上已经得出了,一个整体方案数生成函数的 \(\exp\) 就是任意一个独立整体方案数生成函数(例如上面的连通图与无限制),而 \(\ln\) 的组合意义就是由 \(\exp\) 反向得到的。
参考资料
-
OI Wiki
-
课件 - APJifengc
-
课件 - kai586123