[学习笔记]生成函数
不懂是第几次重修了。
现在可能比较懂了一点。
以下可能略过某些过程。
OGF
fib数列
写作生成函数\(F(x) = x + x F(x) + x ^2 F(x)\)
\(F(x) = \frac{x}{1 - x - x^2}\)
\((1 - ax) (1 - bx) = 1 - x - x^2\)
解得 \(a = \frac{1 + \sqrt 5}{2},b = \frac{1 - \sqrt 5}{2}\)
所以有\(F(x) = \frac{1}{\sqrt 5}(\frac{1}{1 - ax} - \frac{1}{1 - bx}) = \sum \frac{a^i - b^i}{\sqrt 5} x^i\)
则有\(f_n = \frac{1}{\sqrt 5}(a^i - b^i)\)
微积分
\(\frac{d}{dx}(\sum f_nx^n) = \sum (n + 1)f_{n + 1}x^n\)
\(\int(\sum f_n x^n)dx = \sum frac{f_{n - 1}}{n} x^n + C\)
一些OGF的例子
卡特兰数
参见浅谈卡特兰数中生成函数一节。
整数拆分
求\(\sum a_i = n(a_{i + 1}\leq a_i)\)的方案数。
\(P(x) = \prod_{i = 1}\frac{1}{1 - x^i}\)
实际上是对每个数系合并。
五边数定理
\(\prod_{i = 1}\frac{1}{1 - x^i} = \sum (-1) ^ k x ^ {k (3k \pm 1} / 2\\ = 1 - x - x ^ 2 + x ^ 5 + x ^ 5 - x ^ {12} - x ^ {15} .....\)
\(P(x)\prod_{i = 1}\frac{1}{1 - x^i} = 1\)
所以有\(1 + xP(x) + x^2P(x) - x^5 - x^7P(x) .. = P(x)\)
所以有\(p_n = [n = 0] + p_{n - 1} + p_{n - 2} - p_{n - 5} - p_{n - 7}....\)
暴力枚举可以在\(O(n\sqrt n)\)内解决该问题。
EGF
咕咕咕咕。
指数型生成函数
其用来处理一类物品有标号问题。
\(h_n = \sum_{i = 0}^n\binom{n}{i}f_ig_{n - i}\)
我们称其为二项卷积。
那么我们展开组合数。
\(\frac{h_n}{n!} = \sum_{i = 0}\frac{f_i}{i!} \frac{g_{n - i}}{(n - i)!}\)
所以\({\frac{h_n}{n!}}\)是\({\frac{f_n}{n!}}\)和\({\frac{g_n}{n!}}\)的卷积。
所以这也是为什么指数型生成函数给定的是\(F(x) = \sum \frac{x^i}{i!} f_i\)
微积分
\(\frac{d}{dx}\sum f_n \frac{x^n}{n!} = \sum f_{n + 1} \frac{x^n}{n!}\)
\(\int\sum f_n \frac{x^n}{n!} = \sum_{1 \leq n} f_{n - 1} \frac{x^n}{n!}\)
发现求导或积分是对一个生成函数完成系数左移或右移。
如果乘于或除\(x\),就会得到一个类似于\(OGF\)的求导和积分一样的东西:
\(x\sum f_n \frac{x^n}{n!} = \sum_{1 \leq n} \frac{f_{n - 1}}{n} \frac{x^n}{n!}\)
\(\frac{1}{x} (\sum f_n \frac{x^n}{n!} - f_0) = \sum(n + 1)\frac{f_{n + 1}}{n} \frac{x^n}{n!}\)
一些简单的例子
贝尔数——exp
定义\(w_n\),为\({1,2,....,n}\)的集合划分为若干不相交非空子集的并的方案数。
所以有\(w_n = [n = 0] + \sum_{i = 1}^n \binom{n - 1}{i - 1}w_{n - i}\)
知道右边为\({w_n}\)和\({1}\)的二项卷积的\(n - 1\)项,即\(W(x)\)和\(e^x\)乘起来右移一位,即积分一下。
所以\(W(x) = 1 + \int W(x)e^x dx\)
\(\frac{dW(x)}{dx} = W(x)e^x\)
\(\frac{dW(x)}{W(x)} = e^xdx\)
\(ln W(x) = e^x + C\)
代入\(W(x) = e^x = 1(x = 0)\)
所以\(C = -1\)
所以我们得到\(W(x) = \exp(e^x - 1)\)。
我们期望给其一个合理的组合解释。
考虑\(A(x) = e^x - 1\)是只有一个盒子的方案数。
考虑每次乘一个\(A(x)\)就相当于多拼上了一个盒子。
那么\([x^n]A^k(x)\)相当于\(k\)个有标号盒子拼了\(n\)个位置出来,因为我们是无标号的,所以多除一个\(k!\)。
简单无向连接图——ln
求\(f_n\)表示\(n\)个点的简单无向联通图的个数(点带标号)。
令\(g_n\)表示\(n\)个点的简单无向图的个数。
要求\(f_n\),先用\(g_n\)减去不连通的个数,不连通的话,枚举\(1\)号点所在的联通块大小\(i\),先从\(\binom{n - 1}{i - 1}\)选出和\(1\)在一块的方案数,然后\(f_i\)连成一块,\(g_{n - i}\)任意连。
\(f_n = g_n - \sum_{i = 1}^{n - 1}\binom{n - 1}{i - 1}f_ig_{n - i}\)
所以移项得\(g_n = [n = 0] + \sum_{i = 1} ^ n\binom{n - 1}{i - 1}f_ig_{n - i}\)
我们规定\(g_0 = 1,f_0 = 0\)
\(ln G(x) = F(x) + C\)
知\(C = 0\)
所以\(F(x) = ln G(x)\)
强连通竞赛图计数——求逆
考虑其求的是所有有哈密顿回路的竞赛图的哈密顿回路个数的期望。
但实际上所有哈密顿回路的个数很好求,即\((n - 1)!2^{n(n - 1) / 2 - n}\)
那我们只要求有哈密顿回路的竞赛图。
其等价于强连通的竞赛图。
所以令\(f_n\)为\(n\)个点的强连通竞赛图,\(g_n\)为竞赛图个数。
\(g_n = \sum_{i = 1}^n \binom{n}{i}f_ig_{n - i}\)
相当于枚举拓扑序最小的强连通分量的大小。
于是有$G(x) = G(x) F(x) $
所以有\(G(x) = \frac{1}{1 - F(x)}\)
所以有\(F(x) = 1 - \frac{1}{G(x)}\)
无穷背包方案数——ln/exp
设\(f_{i_j} = f_{i- 1,j} + f_{i,j - vi}\)
令\(F_i(x) = \sum f_{i,j}x^j\)
所以有\(F_i(x) = F_{i - 1}(x) + x^{vi}F_i(x)\)
所以最后答案是
\(\prod \frac{1}{1 - x^{vi}}\)
考虑如何算这个东西
发现\(\prod\)很难算。
但其取对数后会变成加法。
\(F(x) = exp ln F(x)\\=exp\sum_{i = 1}^n ln \frac{1}{1 - x^{jvi}}\\=exp \sum_{i = 1}^n\sum_{1\leq j}\frac{x^{jvi}}{j}\)
把\(vi = k\)有\(b_k\)个
所以有\(exp\sum_{1 \leq k}b_k\sum_{1\leq j}\frac{x^{jk}}{j}\)
因为\(exp\)只依赖前\(m\)项,所以我们枚举\(jk\leq m\)即可。
\(ln \ exp\)的另一个用途,在\(\prod 和\)\sum$中反复横跳。