笔记:生成函数简记
笔记:生成函数简记
模拟赛碰到许多生成函数推式子的题目,就来学了一下。
本文是参考 zscoder 的 文章 做的一些笔记!
形式幂级数
数学分析中我们学习了幂级数,多项式是幂级数的一种,设 \(a_i\) 作为第 \(i\) 项的系数,我们设普通生成函数(后文简称 OGF)为:
同时我们规定 \([x^n]A(x)=a_n\) 即取 \(n\) 项系数。
当 \(a_i=1\) 时,这是个很经典的式子:\(A(x)=\frac{1}{1-x}\) 。我们知道 \(A(x)\) 收敛区间是 \([-1,1)\) ,但研究敛散性阻碍了我们对多项式的操作和研究,更重要的,我们通常不关心 \(x\) 的具体取值,\(x\) 的幂次和对应系数是我们研究的重点。
我们称这个一般不研究 \(x\) 取值的函数为形式幂级数。
卡特兰数 OGF
作为例子我们推断卡特兰数 \(c_0=1,c_{n+1}=\sum_{i=0}^nc_ic_{n-i}\) 的 OGF ,两端乘 \(x\) 次幂有:
设 OGF 为 \(C(x)\),左式为 \(C(x)-c_0=C(x)-1\),右式提出一个 \(x\) 后发现是卷积的形式,其为 \(xC(x)^2\) ,我们得到了 \(C(x)-1=xC(x)^2\),解出:
虽然一般不研究 \(x\) 的取值,但有时根据 \(x\) 可以用于确定正负号,这里 \(x=0\) 式子必然收敛,此时 \(C(x)=c_0=1\) ,根据洛必达法则,当上方取负号时:\(\lim_{x\to 0}C(x)=1\) ,因此上式取负号。
组合数生成函数
定义 \(f(n,k)=f(n-1,k)+f(n-1,k-1)\) ,\(f(n,0)=1,n\geq 0\) 和 \(f(0,n)=0,n\geq 1\) ,推式子后,我们得到:
我们有:
我们有 \([x^n]C(x,y)=(y+1)^n=\sum_{k \geq 0}f(n,k)y^k\),则:
我们事先知道 \(f(n,k)=\binom{n}{k}\) ,将其带入就得到了二项式定理的一个情形。
指数生成函数 EGF
区别于 OGF,我们定义指数生成函数 EGF:
做一个阶乘是为了一些计算需要,特别对于组合类的问题,天然包含阶乘。可以发现 EGF 也是一类特殊的 OGF(\(b_i=\frac{a_i}{i!}\))。
贝尔数
贝尔数 \(b_n\) 定义为将 \({1,2,\cdots n}\) 分到若干个集合中的方案数,也等于第二类斯特林数的求和,\(b_0=b_1=1\)。
先求一个递推公式,求解 \(B_{k+1}\) 时,考虑 \(k+1\) 和哪些元素构成一个集合,枚举选了 \(1-k\) 的多少个数,有:
后面的式子考虑 \(\binom{k}{i}=\binom{k}{k-i}\) ,继续推:
两边乘 \(x^{k+1}\) 并求和:
右侧的式子是卷积形式,为 \(xB(x)e^x\) ,左边的式子积分后求解恰好为 \(xB'(x)\) ,因此:
带入 \(B(0)=1\) 得到 \(C=-1\) 则:
因此求出 \(F(x)=e^x-1\) 展开式的前 \(n\) 项系数,求解 多项式 exp 后就能在 \(O(n\log n)\) 时间得到贝尔数前 \(n\) 项。
生成函数代数运算
众多快速的多项式计算方法使得可以对生成函数做快速代数运算。
加法
直接相加对应生成函数。
位移
为了得到 \(c_n=a_{n-k}\) ,对于 OGF,求出 \(C(x)=x^kA(x)\) ,对于 EGF,需要积分 \(k\) 次。
为了得到 \(c_n=a_{n+k}\) ,对于 OGF,\(C(x)=\frac{A(x)-(a_0+a_1x+a_2x^2+\cdots+a_{k-1}x^{k-1})}{x^k}\) .
对于 EGF,求导 \(k\) 次。
乘积 n
求导时发现天然出现了 \(n\) ,则 \(C(x)=xA'(x)\) 即可。
卷积
对于 OGF 来说:\(A(x)B(x)=\sum_{k \geq 0}\sum_{i=0}^ka_ib_{k-i}\) 。
对于 \(EGF\) 来说:
EGF 带来的额外组合数对一些二项式递推有很大优势。
幂次
对于 OGF 来说,\(A(x)^k\) 相当于 \(k\) 次卷积,其恰好等价于分拆系数的乘积!即:
对于 EGF ,多次卷积得到的是广义组合数:
其中 \(\binom{n}{i_1,i_2,\cdots,i_k}=\frac{n!}{i_1!i_2!\cdots i_k!}\) 。
前缀和
求 \(c_n=\sum_{i=0}^n a_i\) 。
EGF 前缀和过于困难这里不讨论,OGF 对 \(\frac{1}{1-x}=1+x+x^2\cdots\) 卷积即可。
常见的展开
几个常见的生成函数需要了解,其实就是泰勒级数展开:
最后的式子用到等式:\(\binom{-k}{n}=(-1)^n\binom{n+k-1}{n}\) 。
例子
卡特兰数闭式表达
我们知道 \(C_n=\frac{1}{n+1}\binom{2n}{n}\) ,现在推这个式子,已知 \(C(x)=\frac{1-\sqrt{1-4x}}{2x}\)。
我们求解 \(\sqrt{1-4x}\) :
带入后得:
第一类斯特林数
定义 \(f(n,k)\) 将 \(n\) 个两两不同得数拆分成 \(k\) 个非空轮换的方案数。
- 引理:环排列,\(n\) 个元素的本质不同的首尾相接的排列个数为 \((n-1)!\) 。
设最终分成的 \(k\) 个轮换的大小为 \(a_1,a_2\cdots,a_k\) ,每个轮换内的环排列为 \((a_i-1)!\) ,同时 \(\sum a_i=n\),根据广义组合数,\(n\) 个数打上 \(a_1,a_2\cdots a_k\) 的标签的方案数是 \(\frac{n!}{a_1!a_2!\cdots a_k!}\) ,设 \(c_n=(n-1)!\)
我们设 \(c_n\) 的 EGF 为 \(C(x)=\sum \frac{c_n}{n!}x^n\) ,根据 EGF 的幂次性质,上式为:\(\frac{n!}{k!}C(x)^k\) ,于是可以在 \(O(n\log n)\) 的时间内推出一整列(固定 \(k\))的 \(f(n,k)\) 。
额外的,第一类斯特林数有递推公式:
- bonus:要求轮换大小必须是给定集合中的数
- 只需要将非集合中的 \(c_n\) 改成 \(0\) 就可以了。
所有排列构成的环的个数期望
我们令 \(g_n\) 表示环个数的和,那么 \(g_n\) 的 EGF \(G(x)\) 的第 \(n\) 项系数就是期望。
而 \(C(x)=\sum_{k\geq 1}\frac{(k-1)!}{k!}x^k=-\ln(1-x)\) ,带入有:
这个式子等价于对 \(F(x)=-\ln(1-x)\) 做前缀和,又 \([x^n]-\ln(1-x)=\frac{1}{n}\), 则:
就是调和级数的和。
第二类斯特林数
和第一类斯特林数不同的是,这里求分成 \(k\) 个集合的方案,则此时 \(C(x)=\sum_n\frac{1}{n!}x^n=e^x\),同理的:
则我们有:
此时发现 \(y=1\) 时这个闭式为贝尔数的生成函数,将 \(y=1\) 带入后,在展开式中就表现为对 \(f(n,k)\) 求和。
- 一个发现:对于对数字分拆的组合问题,求单组元素的 EGF \(D(x)\),则答案的 EGF \(G(x)=\exp(D(x))\) !
使用多项式基本操作,我们可以在模一个多项式的意义下组合出大部分s生成函数的展开式。
连通二分图数量
先考虑不要求连通的染色二分图数量,将二分图按左右部染色,设左边染色了 \(k\) 个,则染色方案有 \(\binom{n}{k}\) ,边总量是 \(k(n-k)\) ,连边方案为 \(2^{k(n-k)}\) ,我们得到:
设其 EGF 为 \(A(x)\) ,设连通染色二分图的 EGF 为 \(B(x)\) ,我们发现 \(a_n\) 和 \(b_n\) 构成分拆关系!即一个二分图可以表示成若干连通二分图的和,则有 \(A(x)=\exp(B(x))\) ,即:
由于染色具有对称性,最终的答案就是 \([x^n]\frac{1}{2}B(x)\) 。
斐波那契额数列通项
先求出其 OGF \(F(x)=\frac{x}{1-x-x^2}\) 。
我们将 \(1-x-x^2\) 因式分解成 \((x-\gamma_1)(x-\gamma_2)\) ,则有:
继续推断可以得到:
解出来带入得到:
于是 \(f_n=\frac{1}{\sqrt{5}}(\gamma_1^n-\gamma_2^n)\) ,就得到了斐波那契额数列通项。

浙公网安备 33010602011771号