面向算法竞赛的生成函数系统学习笔记,从形式幂级数、OGF、EGF、PGF 出发,推导广义二项式、卡塔兰数、斯特林数、伯努利数、分拆、组合结构、拉格朗日反演及多项式算法。
生成函数完整学习笔记:从形式幂级数到组合结构
TAG:生成函数,组合数学,形式幂级数,多项式,算法竞赛
本文是一份面向算法竞赛的生成函数学习笔记。内容参考 command_block 的《多项式计数杂谈》等资料的知识结构重新组织、推导和编写,不是原文搬运。
原文参考:多项式计数杂谈
本文把生成函数视为形式幂级数,除概率生成函数一章外,默认不讨论数值收敛域。行内公式使用博客园可稳定解析的 MathJax 定界符,独立公式统一使用 $$。
0. 生成函数究竟在做什么
生成函数的核心思想是:把一个数列的所有项装进同一个形式幂级数中,再用代数运算同时处理整个数列。
给定数列
\[a_0,a_1,a_2,\ldots,
\]
它的普通生成函数为
\[A(x)=\sum_{n\ge 0}a_nx^n.
\]
这里的 \(x\) 不必被看成一个需要代入数值的未知数。对于组合计数和算法竞赛,我们通常把 \(x\) 当作一个用于记录大小的形式符号:
- \(x^n\) 表示“大小为 \(n\)”;
- \(x^n\) 前的系数表示“大小为 \(n\) 的方案数”;
- 两个对象合并时大小相加,因此对应幂次相乘:
\[x^i\cdot x^j=x^{i+j}.
\]
所以生成函数并不是凭空创造答案,而是在完成两次翻译:
- 把组合对象或递推关系翻译成幂级数方程;
- 解出幂级数并提取所需系数。
学习生成函数时,最重要的也正是这两种能力。
1. 形式幂级数与系数记号
1.1 系数提取
记
\[[x^n]A(x)=a_n,
\]
表示提取 \(A(x)\) 中 \(x^n\) 的系数。
例如
\[A(x)=1+2x+5x^2+7x^3,
\]
则
\[[x^2]A(x)=5.
\]
在本文中,也会把 \(A[n]\) 用作 \(a_n\) 的简写。
1.2 加法
若
\[A(x)=\sum_{n\ge 0}a_nx^n,\qquad
B(x)=\sum_{n\ge 0}b_nx^n,
\]
则
\[[x^n](A(x)+B(x))=a_n+b_n.
\]
因此生成函数的加法对应计数中的分类讨论:若两类方案互不重叠,则总方案数等于两类方案数之和。
1.3 乘法与卷积
\[A(x)B(x)
=\left(\sum_{i\ge 0}a_ix^i\right)
\left(\sum_{j\ge 0}b_jx^j\right).
\]
提取 \(x^n\) 的系数得到
\[[x^n]A(x)B(x)=\sum_{i+j=n}a_ib_j.
\]
这正是加法卷积。
组合意义是:从第一类对象中选一个大小为 \(i\) 的对象,再从第二类对象中选一个大小为 \(j\) 的对象,把二者组成一个大小为 \(i+j\) 的对象。
1.4 平移与拉伸
乘上 \(x^k\) 会把数列整体向右平移 \(k\) 位:
\[[x^n]x^kA(x)=a_{n-k}.
\]
把 \(x\) 替换为 \(x^k\) 会把所有下标扩大 \(k\) 倍:
\[A(x^k)=a_0+a_1x^k+a_2x^{2k}+\cdots.
\]
因此
\[[x^n]A(x^k)=
\begin{cases}
a_{n/k},&k\mid n,\\
0,&k\nmid n.
\end{cases}
\]
1.5 截断
若只关心前 \(n\) 项,可以始终在
\[\bmod x^n
\]
的意义下计算,即只保留次数小于 \(n\) 的项。
这是多项式算法能够加速生成函数计算的基础:更高次的项不可能在只有非负次数的加法、乘法中重新影响低次项。
1.6 形式幂级数不要求数值收敛
经典等式
\[1+x+x^2+x^3+\cdots=\frac{1}{1-x}
\]
在实数意义下要求 \(|x|<1\),但在形式幂级数中,我们只关心等式两侧每一项的系数是否相同。
因为
\[(1-x)(1+x+x^2+\cdots)=1,
\]
所以它在形式幂级数意义下成立。
2. 与生成函数有关的微积分工具
形式幂级数的求导和积分按项定义。
2.1 求导
\[A'(x)=\sum_{n\ge 1}na_nx^{n-1}.
\]
因此
\[[x^n]A'(x)=(n+1)a_{n+1}.
\]
若想让系数乘上自己的下标,使用 Euler 算子
\[\vartheta=x\frac{\mathrm d}{\mathrm dx}.
\]
于是
\[\vartheta A(x)=xA'(x)=\sum_{n\ge 0}na_nx^n,
\]
即
\[[x^n]\vartheta A(x)=na_n.
\]
这条性质极其常用:式子中一旦出现 \(na_n\)、\(n^2a_n\) 等下标因子,就应考虑求导或连续施加 \(\vartheta\)。
2.2 积分
约定积分常数为 \(0\),则
\[\int A(x)\,\mathrm dx
=\sum_{n\ge 0}\frac{a_n}{n+1}x^{n+1}.
\]
因此
\[[x^n]\int A(x)\,\mathrm dx=\frac{a_{n-1}}{n}.
\]
2.3 常用求导法则
\[(A+B)'=A'+B',
\]
\[(AB)'=A'B+AB',
\]
\[\left(\frac{A}{B}\right)'
=\frac{A'B-AB'}{B^2},
\]
\[\bigl(A(B(x))\bigr)'=A'(B(x))B'(x).
\]
2.4 对数与指数
当 \(A(0)=1\) 时,可以定义
\[\ln A(x)=\int\frac{A'(x)}{A(x)}\,\mathrm dx.
\]
当 \(A(0)=0\) 时,可以定义
\[\exp A(x)=\sum_{k\ge 0}\frac{A(x)^k}{k!}.
\]
它们互为逆运算:
\[\ln(\exp A)=A,\qquad \exp(\ln A)=A.
\]
求导公式为
\[(\ln A)'=\frac{A'}{A},
\]
\[(\exp A)'=A'\exp A.
\]
这些式子既能推导递推,也能设计多项式算法。
3. 有限差分与阶乘幂
生成函数中的很多组合数公式,与有限差分比普通微积分更加接近。
3.1 差分算子
定义
\[\Delta f(x)=f(x+1)-f(x).
\]
普通幂 \(x^n\) 在差分下并不简洁,因此引入下降幂和上升幂。
3.2 下降幂与上升幂
下降幂定义为
\[x^{\underline n}
=x(x-1)(x-2)\cdots(x-n+1).
\]
上升幂定义为
\[x^{\overline n}
=x(x+1)(x+2)\cdots(x+n-1).
\]
二者满足
\[x^{\underline n}=(-1)^n(-x)^{\overline n},
\]
\[x^{\overline n}=(-1)^n(-x)^{\underline n}.
\]
下降幂与差分非常匹配:
\[\Delta x^{\underline n}=n x^{\underline{n-1}}.
\]
这与普通微积分中的
\[\frac{\mathrm d}{\mathrm dx}x^n=nx^{n-1}
\]
具有完全类似的形式。
因此
\[\sum_{i=0}^{n-1}i^{\underline k}
=\frac{n^{\underline{k+1}}}{k+1}.
\]
3.3 组合数就是归一化的下降幂
\[\binom{x}{k}=\frac{x^{\underline k}}{k!}.
\]
于是
\[\Delta\binom{x}{k}=\binom{x}{k-1}.
\]
这就是帕斯卡公式、上指标求和以及牛顿插值都与差分紧密相连的原因。
4. 普通生成函数 OGF
4.1 定义
数列 \({a_n}\) 的普通生成函数为
\[A(x)=\sum_{n\ge 0}a_nx^n.
\]
OGF 最适合处理:
- 大小相加;
- 无标号对象;
- 背包式计数;
- 普通卷积;
- 递推数列。
4.2 最基础的已知级数
几何级数:
\[\frac{1}{1-x}=\sum_{n\ge 0}x^n.
\]
带权几何级数:
\[\frac{1}{1-ax}=\sum_{n\ge 0}a^nx^n.
\]
只在 \(k\) 的倍数位置非零:
\[\frac{1}{1-x^k}=\sum_{n\ge 0}x^{kn}.
\]
同时带权:
\[\frac{1}{1-ax^k}=\sum_{n\ge 0}a^nx^{kn}.
\]
对几何级数求导:
\[\frac{1}{(1-x)^2}=\sum_{n\ge 0}(n+1)x^n.
\]
更一般地,
\[\frac{1}{(1-x)^m}
=\sum_{n\ge 0}\binom{n+m-1}{m-1}x^n.
\]
对数级数:
\[\ln\frac{1}{1-x}
=\sum_{n\ge 1}\frac{x^n}{n}.
\]
指数级数:
\[e^x=\sum_{n\ge 0}\frac{x^n}{n!}.
\]
中心二项式系数:
\[\frac{1}{\sqrt{1-4x}}
=\sum_{n\ge 0}\binom{2n}{n}x^n.
\]
卡塔兰数:
\[\frac{1-\sqrt{1-4x}}{2x}
=\sum_{n\ge 0}\frac{1}{n+1}\binom{2n}{n}x^n.
\]
这些公式不应完全孤立记忆。它们大部分都可以由几何级数、求导和广义二项式定理统一推出。
5. 广义二项式定理:统一记忆二项式系数幂级数
5.1 广义二项式系数
对任意数 \(\alpha\) 和非负整数 \(n\),定义
\[\binom{\alpha}{n}
=\frac{\alpha^{\underline n}}{n!}
=\frac{\alpha(\alpha-1)\cdots(\alpha-n+1)}{n!}.
\]
5.2 广义二项式定理
\[(1+x)^\alpha
=\sum_{n\ge 0}\binom{\alpha}{n}x^n.
\]
把 \(x\) 换成 \(-x\),得到
\[(1-x)^\alpha
=\sum_{n\ge 0}(-1)^n\binom{\alpha}{n}x^n.
\]
这是二项式系数幂级数的总源头。
5.3 负整数上指标
令 \(\alpha=-m\),其中 \(m\) 为正整数:
\[(1-x)^{-m}
=\sum_{n\ge 0}(-1)^n\binom{-m}{n}x^n.
\]
利用
\[\binom{-m}{n}
=(-1)^n\binom{m+n-1}{n},
\]
得到
\[\boxed{
(1-x)^{-m}
=\sum_{n\ge 0}\binom{m+n-1}{n}x^n
}.
\]
等价地,
\[\boxed{
[x^n]\frac{1}{(1-x)^m}
=\binom{m+n-1}{n}
=\binom{m+n-1}{m-1}
}.
\]
所以不必分别硬记
\[\frac{1}{1-x},\quad
\frac{1}{(1-x)^2},\quad
\frac{1}{(1-x)^3},\ldots
\]
它们都是广义二项式定理的特例。
5.4 一般线性项
把 \(x\) 换成 \(cx\):
\[(1-cx)^{-m}
=\sum_{n\ge 0}\binom{m+n-1}{n}c^nx^n.
\]
因此
\[\boxed{
[x^n]\frac{1}{(1-cx)^m}
=\binom{m+n-1}{n}c^n
}.
\]
5.5 中心二项式系数
令 \(\alpha=-\frac12\):
\[(1-4x)^{-1/2}
=\sum_{n\ge 0}\binom{-1/2}{n}(-4x)^n.
\]
而
\[\binom{-1/2}{n}(-4)^n=\binom{2n}{n},
\]
所以
\[\boxed{
\frac{1}{\sqrt{1-4x}}
=\sum_{n\ge 0}\binom{2n}{n}x^n
}.
\]
这就是中心二项式系数生成函数的来源。
5.6 如何实际提取系数
例如求
\[[x^5]\frac{1}{(1-x)^3}.
\]
由统一公式
\[[x^n](1-x)^{-m}=\binom{m+n-1}{n},
\]
得到
\[[x^5]\frac{1}{(1-x)^3}
=\binom{3+5-1}{5}
=\binom{7}{5}
=21.
\]
如果是
\[[x^5]\frac{1}{(1-2x)^3},
\]
则还要乘 \(2^5\):
\[[x^5]\frac{1}{(1-2x)^3}
=\binom{7}{5}2^5
=672.
\]
6. 从递推式得到生成函数
6.1 标准步骤
面对递推数列时,通常按下面的流程处理:
- 定义 \(A(x)=\sum_{n\ge 0}a_nx^n\);
- 把递推式乘上 \(x^n\);
- 对所有适用的 \(n\) 求和;
- 用 \(A(x)\)、\(xA(x)\)、\(x^2A(x)\) 等表示错位后的数列;
- 单独处理初值造成的边界项;
- 解出 \(A(x)\);
- 需要通项时再做部分分式分解或系数提取。
6.2 斐波那契数列
定义
\[F_0=0,\qquad F_1=1,\qquad
F_n=F_{n-1}+F_{n-2}\quad(n\ge 2).
\]
设
\[F(x)=\sum_{n\ge 0}F_nx^n.
\]
由递推式,
\[F(x)-x=xF(x)+x^2F(x),
\]
所以
\[\boxed{
F(x)=\frac{x}{1-x-x^2}
}.
\]
分母因式分解后可以得到 Binet 公式:
\[F_n=
\frac{1}{\sqrt5}
\left[
\left(\frac{1+\sqrt5}{2}\right)^n
{}-{}
\left(\frac{1-\sqrt5}{2}\right)^n
\right].
\]
6.3 常系数线性递推必对应有理生成函数
若 \(c_0\ne 0\),并且当 \(n\ge k\) 时
\[c_0a_n+c_1a_{n-1}+\cdots+c_ka_{n-k}=0,
\]
定义
\[C(x)=c_0+c_1x+\cdots+c_kx^k.
\]
直接观察乘积的系数:
\[[x^n]\bigl(C(x)A(x)\bigr)
=c_0a_n+c_1a_{n-1}+\cdots+c_ka_{n-k}.
\]
当 \(n\ge k\) 时,上式恰好由递推关系变成 \(0\)。因此 \(C(x)A(x)\) 从第 \(k\) 项开始全部为零,只剩下由前 \(k\) 项初值决定的低次多项式 \(P(x)\),即
\[C(x)A(x)=P(x),
\]
其中 \(P(x)\) 只由前 \(k\) 项初值决定,且次数小于 \(k\)。
因此
\[\boxed{
A(x)=\frac{P(x)}{C(x)}
}.
\]
这说明:
一个数列满足常系数线性递推,当且仅当它的 OGF 是有理函数。
6.4 特征方程与生成函数是同一件事的两面
对递推
\[a_n=p a_{n-1}+q a_{n-2},
\]
特征方程为
\[r^2-pr-q=0.
\]
而生成函数分母是
\[1-px-qx^2.
\]
若 \(r\) 是特征根,则 \(x=1/r\) 是生成函数分母的根。部分分式分解后自然会出现 \(r^n\),因此两种方法本质一致。
7. 用 OGF 描述组合结构
7.1 不相交并
若组合类 \(\mathcal A\) 与 \(\mathcal B\) 不相交,并令
\[\mathcal C=\mathcal A+\mathcal B,
\]
则
\[C(x)=A(x)+B(x).
\]
7.2 笛卡尔积
若一个 \(\mathcal C\) 对象由一个 \(\mathcal A\) 对象和一个 \(\mathcal B\) 对象组成,且大小相加,则
\[\mathcal C=\mathcal A\times\mathcal B
\]
对应
\[C(x)=A(x)B(x).
\]
7.3 有序序列 SEQ
若 \(\mathcal A\) 中没有大小为 \(0\) 的对象,则由任意多个 \(\mathcal A\) 对象组成的有序序列满足
\[\operatorname{SEQ}(\mathcal A)
=\mathcal E+\mathcal A+\mathcal A^2+\mathcal A^3+\cdots.
\]
对应生成函数
\[\boxed{
\operatorname{SEQ}(A)
=\frac{1}{1-A(x)}
}.
\]
例如长度为 \(1\) 或 \(2\) 的骨牌组成的铺法:
\[A(x)=x+x^2,
\]
\[\operatorname{SEQ}(A)
=\frac{1}{1-x-x^2}.
\]
其系数正是平移后的斐波那契数。
7.4 找零问题与完全背包
使用无限多个面值为 \(1,2,5\) 的硬币支付 \(n\) 元。每种硬币可以选择 \(0,1,2,\ldots\) 枚,因此
\[P(x)
=\left(1+x+x^2+\cdots\right)
\left(1+x^2+x^4+\cdots\right)
\left(1+x^5+x^{10}+\cdots\right).
\]
所以
\[\boxed{
P(x)=\frac{1}{(1-x)(1-x^2)(1-x^5)}
}.
\]
答案是
\[[x^n]P(x).
\]
这与完全背包 DP 完全同构:
- 每种物品对应一个因子;
- 选择次数对应因子中的各项;
- 多项式乘法对应背包合并。
7.5 01 背包
若大小为 \(i\) 的对象共有 \(a_i\) 种,每个对象至多选择一次,则生成函数为
\[\prod_{i\ge 1}(1+x^i)^{a_i}.
\]
若每个对象可以选择任意多次,则为
\[\prod_{i\ge 1}\frac{1}{(1-x^i)^{a_i}}.
\]
8. 卡塔兰数:从组合递归到代数方程
8.1 递推式
卡塔兰数满足
\[C_0=1,
\]
\[C_{n+1}=\sum_{i=0}^{n}C_iC_{n-i}.
\]
令
\[C(x)=\sum_{n\ge 0}C_nx^n.
\]
卷积对应平方,因此
\[C(x)^2=\frac{C(x)-1}{x}.
\]
整理为
\[xC(x)^2-C(x)+1=0.
\]
解二次方程:
\[C(x)=\frac{1\pm\sqrt{1-4x}}{2x}.
\]
由于 \(C(0)=1\),应选择负号:
\[\boxed{
C(x)=\frac{1-\sqrt{1-4x}}{2x}
}.
\]
8.2 提取系数
由
\[C(x)=\frac{1-\sqrt{1-4x}}{2x}
\]
可知对 \(n\ge 0\),常数 \(1\) 不会影响 \(x^{n+1}\) 的系数,因此
\[\begin{aligned}
C_n
&=[x^n]C(x)\\
&=-\frac12[x^{n+1}](1-4x)^{1/2}\\
&=-\frac12\binom{1/2}{n+1}(-4)^{n+1}.
\end{aligned}
\]
再展开广义二项式系数:
\[\binom{1/2}{n+1}
=(-1)^n\frac{(2n)!}{2^{2n+1}n!(n+1)!},
\]
代回并约去符号与 \(2\) 的幂,得到
\[\boxed{
C_n=\frac{1}{n+1}\binom{2n}{n}
}.
\]
8.3 为什么这类方程很常见
例如非空二叉树可以拆成:
若用 \(\mathcal T\) 表示二叉树组合类,则
\[\mathcal T=\mathcal E+\mathcal Z\times\mathcal T\times\mathcal T,
\]
翻译成生成函数就是
\[T(x)=1+xT(x)^2.
\]
因此组合对象的递归分解会自然产生生成函数的代数方程。
9. 指数生成函数 EGF
9.1 定义
数列 \({a_n}\) 的指数生成函数为
\[A(x)=\sum_{n\ge 0}a_n\frac{x^n}{n!}.
\]
EGF 最适合处理有标号对象,因为 \(n!\) 会抵消标号分配产生的组合数。
9.2 乘法对应二项卷积
若
\[A(x)=\sum_{n\ge 0}a_n\frac{x^n}{n!},\qquad
B(x)=\sum_{n\ge 0}b_n\frac{x^n}{n!},
\]
则
\[[x^n]\bigl(A(x)B(x)\bigr)
=\sum_{i+j=n}\frac{a_i}{i!}\frac{b_j}{j!}.
\]
把结果还原为 EGF 系数:
\[\boxed{
c_n=\sum_{i+j=n}\binom{n}{i}a_ib_j
}.
\]
组合意义是:从 \(n\) 个标号中选出 \(i\) 个分给第一部分,其余 \(j\) 个分给第二部分。
9.3 常用 EGF
\[\{1,1,1,\ldots\}
\longleftrightarrow e^x,
\]
\[\{1,-1,1,-1,\ldots\}
\longleftrightarrow e^{-x},
\]
\[\{1,c,c^2,c^3,\ldots\}
\longleftrightarrow e^{cx},
\]
\[\{1,0,1,0,1,0,\ldots\}
\longleftrightarrow \frac{e^x+e^{-x}}{2},
\]
\[\{0,1,0,1,0,1,\ldots\}
\longleftrightarrow \frac{e^x-e^{-x}}{2}.
\]
注意:从 EGF 中提取普通计数答案时,要乘回 \(n!\):
\[a_n=n![x^n]A(x).
\]
9.4 有标号集合 SET
若一个大对象是若干个 \(\mathcal A\) 对象组成的无序集合,则
\[\boxed{
\operatorname{SET}(\mathcal A)
\longleftrightarrow
\exp(A(x))
}.
\]
因为恰选 \(k\) 个部件的 EGF 是
\[\frac{A(x)^k}{k!},
\]
对所有 \(k\) 求和即
\[\sum_{k\ge 0}\frac{A(x)^k}{k!}
=\exp(A(x)).
\]
9.5 有标号序列 SEQ
\[\boxed{
\operatorname{SEQ}(\mathcal A)
\longleftrightarrow
\frac{1}{1-A(x)}
}.
\]
虽然形式与 OGF 相同,但其乘法现在自动包含标号的二项分配。
9.6 有标号环 CYC
大小为 \(k\) 的有标号环有 \((k-1)!\) 种,因此单个环的 EGF 为
\[\sum_{k\ge 1}(k-1)!\frac{x^k}{k!}
=\sum_{k\ge 1}\frac{x^k}{k}
=\ln\frac{1}{1-x}.
\]
把原子 \(x\) 换成一般组合类 \(A(x)\),得到
\[\boxed{
\operatorname{CYC}(\mathcal A)
\longleftrightarrow
\ln\frac{1}{1-A(x)}
}.
\]
9.7 置换计数
一个置换是若干个不相交环组成的集合:
\[\operatorname{PERM}
=\operatorname{SET}(\operatorname{CYC}(\mathcal Z)).
\]
因此
\[P(x)
=\exp\left(\ln\frac{1}{1-x}\right)
=\frac{1}{1-x}.
\]
由于这是 EGF,
\[p_n=n![x^n]\frac{1}{1-x}=n!,
\]
与排列总数一致。
若只允许环长属于集合 \(S\),则单个环的 EGF 为
\[C_S(x)=\sum_{k\in S}\frac{x^k}{k},
\]
答案 EGF 为
\[\boxed{
P_S(x)=\exp\left(\sum_{k\in S}\frac{x^k}{k}\right)
}.
\]
9.8 错排
错排要求没有长度为 \(1\) 的环,因此
\[D(x)
=\exp\left(\sum_{k\ge 2}\frac{x^k}{k}\right).
\]
而
\[\sum_{k\ge 2}\frac{x^k}{k}
=\ln\frac{1}{1-x}-x,
\]
所以
\[\boxed{
D(x)=\frac{e^{-x}}{1-x}
}.
\]
提取系数得到
\[D_n=n!\sum_{k=0}^{n}\frac{(-1)^k}{k!}.
\]
9.9 连通结构与全体结构
若任意对象都可以唯一拆成若干个连通分量,并且这些分量无序,则
\[\mathcal G=\operatorname{SET}(\mathcal C),
\]
从而
\[G(x)=\exp(C(x)).
\]
因此
\[\boxed{
C(x)=\ln G(x)
}.
\]
这条原则会反复出现在有标号图、连通二分图、连通竞赛图等计数问题中。
10. 概率生成函数 PGF
10.1 定义
对取非负整数值的离散随机变量 \(X\),定义概率生成函数
\[F(z)=\mathbb E[z^X]
=\sum_{n\ge 0}\Pr(X=n)z^n.
\]
由于概率和为 \(1\),有
\[F(1)=1.
\]
10.2 阶乘矩
\[F'(1)=\mathbb E[X].
\]
更一般地,
\[\boxed{
F^{(k)}(1)=\mathbb E\left[X^{\underline k}\right]
}.
\]
例如
\[F''(1)=\mathbb E[X(X-1)].
\]
因为
\[X^2=X(X-1)+X,
\]
所以
\[\mathbb E[X^2]=F''(1)+F'(1).
\]
进而
\[\boxed{
\operatorname{Var}(X)
=F''(1)+F'(1)-F'(1)^2
}.
\]
10.3 独立随机变量之和
若 \(X,Y\) 独立,则
\[\mathbb E[z^{X+Y}]
=\mathbb E[z^X]\mathbb E[z^Y].
\]
因此
\[\boxed{
F_{X+Y}(z)=F_X(z)F_Y(z)
}.
\]
这说明 PGF 的乘法对应独立随机变量求和。
10.4 常见分布
参数为 \(p\) 的 Bernoulli 分布:
\[F(z)=1-p+pz.
\]
\(n\) 次独立 Bernoulli 试验得到的二项分布:
\[F(z)=(1-p+pz)^n.
\]
取值为 \(0,1,2,\ldots\),成功概率为 \(p\) 的几何分布:
\[F(z)=\frac{p}{1-(1-p)z}.
\]
参数为 \(\lambda\) 的 Poisson 分布:
\[F(z)=e^{\lambda(z-1)}.
\]
11. 二项式恒等式与反演
11.1 帕斯卡公式
\[\binom{n}{k}
=\binom{n-1}{k}+\binom{n-1}{k-1}.
\]
11.2 对称性与吸收
\[\binom{n}{k}=\binom{n}{n-k},
\]
\[k\binom{n}{k}=n\binom{n-1}{k-1}.
\]
11.3 上指标求和
\[\boxed{
\sum_{i=0}^{n}\binom{i}{k}
=\binom{n+1}{k+1}
}.
\]
11.4 范德蒙德卷积
比较
\[(1+x)^{n+m}=(1+x)^n(1+x)^m
\]
两边 \(x^k\) 的系数,得到
\[\boxed{
\sum_{i=0}^{k}\binom{n}{i}\binom{m}{k-i}
=\binom{n+m}{k}
}.
\]
它本质上就是两个二项式系数数列的卷积。
11.5 二项式反演
若
\[f_n=\sum_{k=0}^{n}\binom{n}{k}g_k,
\]
则
\[\boxed{
g_n=\sum_{k=0}^{n}(-1)^{n-k}\binom{n}{k}f_k
}.
\]
带符号的等价形式为
\[f_n=\sum_{k=0}^{n}(-1)^k\binom{n}{k}g_k
\Longleftrightarrow
g_n=\sum_{k=0}^{n}(-1)^k\binom{n}{k}f_k.
\]
二项式反演经常用于把“钦定至少满足某些条件”还原为“恰好满足条件”。
11.6 差分公式
\[\boxed{
\Delta^nf(x)
=\sum_{k=0}^{n}(-1)^{n-k}\binom{n}{k}f(x+k)
}.
\]
这里要区分两种差分记号。前面定义的
\[\Delta f(n)=f(n+1)-f(n)
\]
是函数在整数点上的前向差分。而对数列约定 \(a_{-1}=0\),定义
\[\nabla a_n=a_n-a_{n-1},
\]
则 \(\nabla\) 是后向差分。若
\[A(x)=\sum_{n\ge0}a_nx^n,
\]
那么
\[\sum_{n\ge0}(\nabla a_n)x^n=(1-x)A(x).
\]
反过来,若 \(b_n=\sum_{i=0}^{n}a_i\),则
\[B(x)=\sum_{n\ge0}b_nx^n=\frac{A(x)}{1-x}.
\]
所以在不混淆下标方向的前提下:
- 乘 \((1-x)^k\) 对应做 \(k\) 次后向差分;
- 除 \((1-x)^k\) 对应做 \(k\) 次前缀和。
因为
\[(1-x)^{-k}
=\sum_{n\ge 0}\binom{n+k-1}{k-1}x^n,
\]
所以 \(k\) 阶前缀和的卷积核正是
\[\binom{n+k-1}{k-1}.
\]
12. 牛顿级数
普通幂 \(1,x,x^2,\ldots\) 可以作为多项式的一组基;组合数多项式
\[\binom{x}{0},\binom{x}{1},\binom{x}{2},\ldots
\]
也可以作为一组基。
对次数不超过 \(m\) 的多项式 \(f(x)\),有牛顿展开
\[\boxed{
f(x)=\sum_{k=0}^{m}\Delta^kf(0)\binom{x}{k}
}.
\]
原因是
\[\Delta\binom{x}{k}=\binom{x}{k-1},
\]
因此连续差分可以像连续求导普通幂一样逐层剥离系数。
牛顿级数在以下场景尤其有用:
- 已知 \(f(0),f(1),\ldots,f(m)\),希望恢复多项式;
- 多次做平移或差分;
- 在普通幂、下降幂和点值表示之间转换;
- 使用卷积加速二项式变换。
13. 第一类斯特林数
13.1 定义
无符号第一类斯特林数
\[\begin{bmatrix}n\\k\end{bmatrix}
\]
表示把 \(n\) 个有标号元素组成恰好 \(k\) 个不相交环的方案数,也就是恰有 \(k\) 个循环节的 \(n\) 元置换数。
13.2 递推
加入新元素 \(n\):
- 它可以单独构成一个新环;
- 也可以插入已有环的某个位置,全部环一共有 \(n-1\) 个插入位置。
所以
\[\boxed{
\begin{bmatrix}n\\k\end{bmatrix}
{}={}
\begin{bmatrix}n-1\\k-1\end{bmatrix}
+(n-1)
\begin{bmatrix}n-1\\k\end{bmatrix}
}.
\]
边界为
\[\begin{bmatrix}0\\0\end{bmatrix}=1.
\]
13.3 与上升幂的关系
\[\boxed{
x^{\overline n}
=\sum_{k=0}^{n}
\begin{bmatrix}n\\k\end{bmatrix}x^k
}.
\]
由
\[x^{\underline n}=(-1)^n(-x)^{\overline n}
\]
又有
\[\boxed{
x^{\underline n}
=\sum_{k=0}^{n}
(-1)^{n-k}
\begin{bmatrix}n\\k\end{bmatrix}x^k
}.
\]
因此第一类斯特林数负责在“普通幂”和“阶乘幂”之间转换。
13.4 EGF
恰有 \(k\) 个环的置换,是 \(k\) 个有标号环组成的集合,因此
\[\boxed{
\sum_{n\ge k}
\begin{bmatrix}n\\k\end{bmatrix}
\frac{x^n}{n!}
{}={}
\frac{1}{k!}
\left(\ln\frac{1}{1-x}\right)^k
}.
\]
再用 \(y\) 标记环数,得到二元 EGF:
\[\boxed{
\sum_{n,k\ge 0}
\begin{bmatrix}n\\k\end{bmatrix}
\frac{x^n}{n!}y^k
=(1-x)^{-y}
}.
\]
14. 第二类斯特林数
14.1 定义
第二类斯特林数
\[\begin{Bmatrix}n\\k\end{Bmatrix}
\]
表示把 \(n\) 个有标号元素划分成恰好 \(k\) 个非空无标号集合的方案数。
也可以理解为:把 \(n\) 个不同小球放入 \(k\) 个相同盒子,要求没有空盒。
14.2 递推
加入新元素 \(n\):
- 单独组成一个新集合;
- 放进已有的 \(k\) 个集合之一。
因此
\[\boxed{
\begin{Bmatrix}n\\k\end{Bmatrix}
{}={}
\begin{Bmatrix}n-1\\k-1\end{Bmatrix}
+k
\begin{Bmatrix}n-1\\k\end{Bmatrix}
}.
\]
14.3 与下降幂的关系
\[\boxed{
x^n
=\sum_{k=0}^{n}
\begin{Bmatrix}n\\k\end{Bmatrix}
x^{\underline k}
}.
\]
组合解释是:把 \(n\) 个有标号位置映射到 \(x\) 个值。
若像的大小恰为 \(k\):
- 先把 \(n\) 个位置划分成 \(k\) 个非空原像集合;
- 再从 \(x\) 个值中有序选择 \(k\) 个不同值。
方案数为
\[\begin{Bmatrix}n\\k\end{Bmatrix}x^{\underline k}.
\]
14.4 容斥公式
把 \(n\) 个有标号元素放入 \(k\) 个有标号盒子且无空盒的方案数为
\[k!\begin{Bmatrix}n\\k\end{Bmatrix}.
\]
对空盒容斥:
\[\boxed{
\begin{Bmatrix}n\\k\end{Bmatrix}
=\frac{1}{k!}
\sum_{i=0}^{k}
(-1)^{k-i}\binom{k}{i}i^n
}.
\]
14.5 EGF
一个非空集合的 EGF 是
\[e^x-1.
\]
取 \(k\) 个非空集合并忽略它们的顺序:
\[\boxed{
\sum_{n\ge k}
\begin{Bmatrix}n\\k\end{Bmatrix}
\frac{x^n}{n!}
=\frac{(e^x-1)^k}{k!}
}.
\]
用 \(y\) 标记集合数:
\[\boxed{
\sum_{n,k\ge 0}
\begin{Bmatrix}n\\k\end{Bmatrix}
\frac{x^n}{n!}y^k
=\exp\left(y(e^x-1)\right)
}.
\]
令 \(y=1\),得到 Bell 数的 EGF:
\[\sum_{n\ge 0}B_n\frac{x^n}{n!}
=\exp(e^x-1).
\]
14.6 自然数幂和
由
\[i^m
=\sum_{k=0}^{m}
\begin{Bmatrix}m\\k\end{Bmatrix}
i^{\underline k}
\]
以及
\[i^{\underline k}=k!\binom{i}{k},
\]
可得
\[\sum_{i=0}^{n}i^m
{}={}
\sum_{k=0}^{m}
\begin{Bmatrix}m\\k\end{Bmatrix}
k!\sum_{i=0}^{n}\binom{i}{k}.
\]
使用上指标求和:
\[\boxed{
\sum_{i=0}^{n}i^m
{}={}
\sum_{k=0}^{m}
\begin{Bmatrix}m\\k\end{Bmatrix}
k!\binom{n+1}{k+1}
}.
\]
这是一种不依赖硬记 Faulhaber 公式的自然推导。
15. 斯特林反演
两类斯特林数描述了普通幂、下降幂、上升幂之间的基变换,因此它们互为反演矩阵。
若
\[f_n
=\sum_{k=0}^{n}
\begin{Bmatrix}n\\k\end{Bmatrix}g_k,
\]
则
\[\boxed{
g_n
=\sum_{k=0}^{n}
(-1)^{n-k}
\begin{bmatrix}n\\k\end{bmatrix}f_k
}.
\]
反方向为
\[f_n
=\sum_{k=0}^{n}
\begin{bmatrix}n\\k\end{bmatrix}g_k
\]
当且仅当
\[\boxed{
g_n
=\sum_{k=0}^{n}
(-1)^{n-k}
\begin{Bmatrix}n\\k\end{Bmatrix}f_k
}.
\]
记忆时不必死记符号:
- 第二类斯特林数把普通幂展开成下降幂;
- 带符号的第一类斯特林数负责逆变换;
- 无符号第一类斯特林数把上升幂展开成普通幂。
16. 伯努利数与自然数幂和
16.1 定义
伯努利数 \(B_n\) 的 EGF 定义为
\[\boxed{
\frac{x}{e^x-1}
=\sum_{n\ge 0}B_n\frac{x^n}{n!}
}.
\]
前几项为
\[B_0=1,\quad B_1=-\frac12,\quad
B_2=\frac16,\quad B_3=0,\quad
B_4=-\frac1{30}.
\]
除 \(B_1\) 外,所有奇数下标的伯努利数都为 \(0\)。
16.2 幂和生成函数
考虑
\[S_m(n)=\sum_{i=0}^{n-1}i^m.
\]
对 \(m\) 建立 EGF:
\[\sum_{m\ge 0}S_m(n)\frac{x^m}{m!}
=\sum_{i=0}^{n-1}e^{ix}.
\]
右侧是等比数列:
\[\sum_{i=0}^{n-1}e^{ix}
=\frac{e^{nx}-1}{e^x-1}
=\frac{x}{e^x-1}\cdot\frac{e^{nx}-1}{x}.
\]
展开
\[\frac{e^{nx}-1}{x}
=\sum_{j\ge 0}\frac{n^{j+1}}{(j+1)!}x^j,
\]
与伯努利数 EGF 卷积,得到
\[\boxed{
\sum_{i=0}^{n-1}i^m
=\frac{1}{m+1}
\sum_{k=0}^{m}
\binom{m+1}{k}B_k n^{m+1-k}
}.
\]
需要注意伯努利数存在两种 \(B_1\) 符号约定。本文采用
\[B_1=-\frac12.
\]
17. 欧拉排列数
这里讨论的是 Eulerian number,而不是满足三角函数展开的 Euler number。记
\[\left\langle{n\atop k}\right\rangle,
\]
表示 \(n\) 元排列中恰有 \(k\) 个上升位置的排列数。
17.1 递推
把最大元素 \(n\) 插入一个 \(n-1\) 元排列中:
\[\boxed{
\left\langle{n\atop k}\right\rangle
=(k+1)\left\langle{n-1\atop k}\right\rangle
+(n-k)\left\langle{n-1\atop k-1}\right\rangle
}.
\]
边界为
\[\left\langle{1\atop 0}\right\rangle=1.
\]
在二元生成函数中还约定
\[\left\langle{0\atop 0}\right\rangle=1.
\]
17.2 与幂函数的关系
Eulerian 数满足
\[\boxed{
x^n
=\sum_{k=0}^{n-1}
\left\langle{n\atop k}\right\rangle
\binom{x+k}{n}
}.
\]
更常用于生成函数的形式是
\[\boxed{
\sum_{m\ge 0}m^n x^m
=\frac{\displaystyle
\sum_{k=0}^{n-1}
\left\langle{n\atop k}\right\rangle x^{k+1}}
{(1-x)^{n+1}}
}.
\]
因此固定 \(n\) 时,数列 \(m^n\) 的 OGF 是分母为 \((1-x)^{n+1}\) 的有理函数。
17.3 二元 EGF
\[\boxed{
\sum_{n,k\ge 0}
\left\langle{n\atop k}\right\rangle
\frac{x^n}{n!}y^k
=\frac{1-y}{e^{x(y-1)}-y}
}.
\]
18. 整数分拆
18.1 定义
整数分拆数 \(p(n)\) 表示把 \(n\) 写成若干正整数之和的无序方案数。
例如
\[4,\quad 3+1,\quad 2+2,\quad 2+1+1,\quad 1+1+1+1,
\]
所以
\[p(4)=5.
\]
18.2 OGF
整数 \(k\) 可以使用 \(0,1,2,\ldots\) 次,对应
\[1+x^k+x^{2k}+\cdots=\frac{1}{1-x^k}.
\]
对所有 \(k\) 相乘:
\[\boxed{
P(x)=\sum_{n\ge 0}p(n)x^n
=\prod_{k\ge 1}\frac{1}{1-x^k}
}.
\]
这就是无限种物品的完全背包。
18.3 限制每个数至多使用 \(K-1\) 次
\[1+x^k+x^{2k}+\cdots+x^{(K-1)k}
=\frac{1-x^{Kk}}{1-x^k}.
\]
所以
\[\boxed{
P_K(x)
=\prod_{k\ge 1}\frac{1-x^{Kk}}{1-x^k}
}.
\]
分子会与分母中所有下标为 \(K\) 的倍数的因子抵消,于是还可以写成
\[P_K(x)
=\prod_{\substack{r\ge1\\K\nmid r}}\frac{1}{1-x^r}.
\]
因此“每个部件至多出现 \(K-1\) 次”与“所有部件都不能被 \(K\) 整除”具有相同的分拆数。这是 Glaisher 分拆定理的生成函数证明。
18.4 Ferrers 图与共轭分拆
把分拆画成左对齐的方格图,再沿主对角线翻转,可以得到共轭分拆。
这建立了双射:
把 \(n\) 分拆成不超过 \(m\) 个部分的方案数
等于
把 \(n\) 分拆成每部分不超过 \(m\) 的方案数。
后者的生成函数为
\[\boxed{
\prod_{k=1}^{m}\frac{1}{1-x^k}
}.
\]
18.5 欧拉五边形数定理
\[\boxed{
\prod_{k\ge 1}(1-x^k)
{}={}
\sum_{t=-\infty}^{\infty}
(-1)^t x^{t(3t-1)/2}
}.
\]
展开为
\[1-x-x^2+x^5+x^7-x^{12}-x^{15}+\cdots.
\]
由于
\[P(x)\prod_{k\ge 1}(1-x^k)=1,
\]
比较 \(x^n\) 系数得到递推
\[\boxed{
p(n)=
\sum_{k\ge 1}(-1)^{k-1}
\left(
p\left(n-\frac{k(3k-1)}2\right)
{}+{}
p\left(n-\frac{k(3k+1)}2\right)
\right)
},
\]
其中 \(p(0)=1\),负下标视为 \(0\)。
每个 \(n\) 只需枚举 \(O(\sqrt n)\) 个广义五边形数,所以求出 \(p(0),\ldots,p(n)\) 的总复杂度为
\[O(n\sqrt n).
\]
19. 无标号组合构造
有标号结构常由 EGF 的 \(\exp\)、\(\ln\) 描述;无标号结构需要更谨慎地处理旋转、置换等对称性。
19.1 无标号多重集 MSET
假设大小为 \(i\) 的 \(\mathcal A\) 对象共有 \(a_i\) 种,每一种对象都可以选择任意次。
则
\[\boxed{
\operatorname{MSET}(\mathcal A)
\longleftrightarrow
\prod_{i\ge 1}\frac{1}{(1-x^i)^{a_i}}
}.
\]
取对数:
\[\ln B(x)
=\sum_{i\ge 1}a_i\ln\frac{1}{1-x^i}.
\]
利用
\[\ln\frac{1}{1-y}
=\sum_{k\ge 1}\frac{y^k}{k},
\]
得到
\[\boxed{
\ln B(x)
=\sum_{i\ge 1}\sum_{k\ge 1}
\frac{a_i}{k}x^{ik}
}.
\]
等价地,
\[[x^n]\ln B(x)
=\frac{1}{n}\sum_{d\mid n}d\,a_d.
\]
因此 MSET 可以通过“枚举倍数求 \(\ln\) + 多项式 \(\exp\)”计算,这个变换也常被称为 Euler 变换或 Pólya 指数变换。
19.2 无标号子集 PSET
每个具体对象至多选择一次:
\[\boxed{
\operatorname{PSET}(\mathcal A)
\longleftrightarrow
\prod_{i\ge 1}(1+x^i)^{a_i}
}.
\]
取对数:
\[\ln B(x)
=\sum_{i\ge 1}a_i\ln(1+x^i)
=\sum_{i\ge 1}\sum_{k\ge 1}
\frac{(-1)^{k-1}a_i}{k}x^{ik}.
\]
19.3 无标号环 CYC
无标号环需要把旋转后相同的排列视作同一种。使用 Burnside 引理可以得到
\[\boxed{
\operatorname{CYC}(A)(x)
{}={}
\sum_{d\ge 1}
\frac{\varphi(d)}{d}
\ln\frac{1}{1-A(x^d)}
}.
\]
这里 \(\varphi\) 是 Euler 函数。
不要把这个公式与有标号环
\[\ln\frac{1}{1-A(x)}
\]
混淆。无标号环必须额外处理周期和旋转对称。
20. 多项式的常用高级运算
设只需要前 \(n\) 项,并假设模数适合 NTT。下面的运算通常可以做到 \(O(n\log n)\) 或 \(O(n\log^2n)\)。
20.1 多项式求逆
求 \(B(x)\) 使
\[A(x)B(x)\equiv1\pmod{x^n}.
\]
必要条件是
\[A(0)\ne0.
\]
若已经得到模 \(x^m\) 的近似逆 \(B\),Newton 迭代为
\[\boxed{
B_{\mathrm{new}}
=B(2-AB)\pmod{x^{2m}}
}.
\]
20.2 多项式对数
当 \(A(0)=1\) 时,
\[\boxed{
\ln A
=\int\frac{A'}{A}\,\mathrm dx
}.
\]
计算流程是求导、求逆、乘法、积分。
20.3 多项式指数
当 \(A(0)=0\) 时,求 \(B=\exp A\)。
因为
\[\ln B=A,
\]
Newton 迭代可写为
\[\boxed{
B_{\mathrm{new}}
=B\bigl(1+A-\ln B\bigr)
\pmod{x^{2m}}
}.
\]
20.4 多项式幂
若 \(k\) 是非负整数且 \(A(0)=1\),则
\[\boxed{
A(x)^k=\exp(k\ln A(x))
}.
\]
若最低非零项为
\[A(x)=a_tx^t+\cdots,
\]
则先提出
\[A(x)=a_tx^tB(x),\qquad B(0)=1,
\]
从而
\[A(x)^k=a_t^kx^{tk}\exp(k\ln B(x)).
\]
20.5 多项式开方
求 \(B^2=A\),Newton 迭代为
\[\boxed{
B_{\mathrm{new}}
=\frac12\left(B+\frac{A}{B}\right)
\pmod{x^{2m}}
}.
\]
常数项要先选择一个合法平方根。
20.6 一般 Newton 迭代
若要求解
\[\Phi(F(x))=0,
\]
且已经得到精确到 \(x^m\) 的近似解 \(F_{\ast}\),同时 \(\Phi'(F_{\ast})\) 在当前系数环中可逆,则
\[\boxed{
F_{\mathrm{new}}
=F_{\ast}-\frac{\Phi(F_{\ast})}{\Phi'(F_{\ast})}
\pmod{x^{2m}}
}.
\]
原因是把 \(\Phi(F)\) 在 \(F_{\ast}\) 处作形式 Taylor 展开。由于
\[F-F_{\ast}\equiv0\pmod{x^m},
\]
二次及以上项都至少是 \(x^{2m}\),在当前精度下可以忽略。
20.7 线性递推、Berlekamp–Massey 与 Bostan–Mori
这三个概念容易因为缩写相近而混淆。
Berlekamp–Massey
Berlekamp–Massey 算法的输入是一段数列
\[a_0,a_1,\ldots,a_{N-1},
\]
目标是找出能够解释这段数列的最短线性递推:
\[a_n=c_1a_{n-1}+c_2a_{n-2}+\cdots+c_La_{n-L}.
\]
若最短递推长度为 \(L\),经典实现复杂度为
\[O(NL),
\]
最坏为 \(O(N^2)\)。
如果数列确实由长度为 \(L\) 的最短线性递推生成,并且计算所在的域没有退化问题,那么前 \(2L\) 项足以唯一确定这条最短递推。因此实际做题时若不知道 \(L\),通常先根据状态数、矩阵维数或小数据增长估计一个上界,再至少计算其两倍数量的初项,并额外多算若干项进行回代验证。
它解决的是:
已知若干项,反推出递推关系。
Bostan–Mori
若已经知道有理生成函数
\[A(x)=\frac{P(x)}{Q(x)},
\]
希望求极大的下标 \(n\) 对应的
\[[x^n]A(x),
\]
则可以使用 Bostan–Mori。
记
\[Q(-x)
\]
为把 \(Q(x)\) 的奇数次项取反后得到的多项式。构造
\[P(x)Q(-x),\qquad Q(x)Q(-x).
\]
第二个乘积只含偶数次项。根据 \(n\) 的奇偶性,从第一个乘积取偶数项或奇数项,再把所有次数除以 \(2\),就把问题规模从 \(n\) 降到 \(\lfloor n/2\rfloor\)。
更具体地,令
\[U(x)=P(x)Q(-x),\qquad
V(x)=Q(x)Q(-x)=\widetilde V(x^2).
\]
把 \(U\) 拆成
\[U(x)=U_0(x^2)+xU_1(x^2),
\]
其中 \(U_0\) 收集偶数次项,\(U_1\) 收集奇数次项,则
\[[x^n]\frac{P(x)}{Q(x)}
=
\begin{cases}
[x^{n/2}]\dfrac{U_0(x)}{\widetilde V(x)},&n\text{ 为偶数},\\
[x^{(n-1)/2}]\dfrac{U_1(x)}{\widetilde V(x)},&n\text{ 为奇数}.
\end{cases}
\]
不断递归后即可求出答案。使用快速多项式乘法时,复杂度约为
\[O(M(L)\log n),
\]
其中 \(M(L)\) 是长度 \(L\) 的多项式乘法复杂度。
当下标最终降为 \(0\) 时,答案就是当前 \(P(0)/Q(0)\)。这也解释了为什么算法每一轮只需保留与当前下标奇偶性相同的那一半系数。
它解决的是:
已知递推或有理生成函数,快速求第 \(n\) 项。
因此常见流程是:
\[\boxed{
\text{数列前若干项}
\xrightarrow{\text{Berlekamp--Massey}}
\text{最短线性递推}
\xrightarrow{\text{有理 OGF / Bostan--Mori}}
\text{第 }n\text{ 项}
}.
\]
21. 拉格朗日反演
拉格朗日反演用于从隐式方程中提取单个或全部系数。
21.1 常用形式
若
\[F(x)=x\phi(F(x)),
\qquad \phi(0)\ne0,
\]
则对 \(n\ge1\),
\[\boxed{
[x^n]F(x)
=\frac1n[t^{n-1}]\phi(t)^n
}.
\]
更一般地,
\[\boxed{
[x^n]H(F(x))
=\frac1n[t^{n-1}]H'(t)\phi(t)^n
}.
\]
这一式同样要求 \(n\ge1\);常数项应单独取为 \(H(F(0))=H(0)\)。
21.2 复合逆形式
若 \(G(F(x))=x\),且
\[F(0)=G(0)=0,\qquad F'(0)\ne0,
\]
则
\[\boxed{
[x^n]G(x)
=\frac1n[t^{n-1}]
\left(\frac{t}{F(t)}\right)^n
}.
\]
这与带 \([t^{-1}]\) 的 Laurent 级数写法等价:
\[[x^n]G(x)
=\frac1n[t^{-1}]F(t)^{-n}.
\]
21.3 \(m\) 叉树
非空 \(m\) 叉树满足
\[T(x)=x(1+T(x))^m.
\]
这里
\[\phi(t)=(1+t)^m.
\]
由拉格朗日反演,
\[[x^n]T(x)
=\frac1n[t^{n-1}](1+t)^{mn}.
\]
所以
\[\boxed{
[x^n]T(x)
=\frac1n\binom{mn}{n-1}
=\frac{1}{(m-1)n+1}\binom{mn}{n}
}.
\]
当 \(m=2\) 时就是卡塔兰数。
21.4 有标号有根树
有标号有根树满足
\[\mathcal T
=\mathcal Z\times\operatorname{SET}(\mathcal T),
\]
因此 EGF 满足
\[T(x)=xe^{T(x)}.
\]
由拉格朗日反演,
\[[x^n]T(x)
=\frac1n[t^{n-1}]e^{nt}
=\frac{n^{n-1}}{n!}.
\]
乘回 \(n!\):
\[\boxed{
t_n=n^{n-1}
}.
\]
这就是有标号有根树的计数公式。
22. 求导大法与常微分方程
当生成函数由复杂求和、复合或特殊系数组成时,直接提取系数可能困难。此时可以尝试:
- 对生成函数求导;
- 消去难处理的闭式表达;
- 得到只含 \(F,F',F'',\ldots\) 的微分方程;
- 提取系数转化为递推。
22.1 指数
若
\[F(x)=\exp(A(x)),
\]
则
\[\boxed{
F'(x)=A'(x)F(x)
}.
\]
设
\[F(x)=\sum_{n\ge0}f_nx^n,\qquad
A'(x)=\sum_{n\ge0}b_nx^n,
\]
则
\[(n+1)f_{n+1}
=\sum_{i=0}^{n}b_if_{n-i}.
\]
这既是递推,也是半在线卷积的来源。
22.2 有理函数乘指数
若通过代数变形得到
\[P(x)F'(x)=Q(x)F(x)+R(x),
\]
其中 \(P,Q,R\) 是低次多项式,则比较 \(x^n\) 系数后,通常能得到只依赖有限个前项的递推。
这常用于把一个看似需要大规模卷积的答案化为 \(O(n)\) 或 \(O(kn)\) 递推。
22.3 截断指数和
设
\[G_k(x)=\sum_{i=0}^{k}\frac{x^i}{i!}.
\]
则
\[G_k'(x)=G_k(x)-\frac{x^k}{k!}.
\]
若再复合 \(F(x)\),令
\[T(x)=G_k(F(x)),
\]
由链式法则,
\[\boxed{
T'(x)
=F'(x)\left(T(x)-\frac{F(x)^k}{k!}\right)
}.
\]
因此“有限项指数和的复合”也可以通过微分方程处理。
23. 多项式平移与差卷积
23.1 多项式平移
已知
\[F(x)=\sum_{i=0}^{n}f_ix^i,
\]
希望求
\[G(x)=F(x+c).
\]
展开:
\[F(x+c)
=\sum_{i=0}^{n}f_i
\sum_{j=0}^{i}\binom{i}{j}x^jc^{i-j}.
\]
所以
\[\boxed{
g_j
=\frac1{j!}
\sum_{i=j}^{n}
f_i i!\frac{c^{i-j}}{(i-j)!}
}.
\]
令
\[P_i=f_i i!,\qquad
H_k=\frac{c^k}{k!},
\]
则
\[j!g_j
=\sum_{i=j}^{n}P_iH_{i-j}.
\]
把 \(P\) 翻转后即可化为普通卷积,复杂度为 \(O(n\log n)\)。
23.2 差卷积
形如
\[g_j=\sum_{i=j}^{n}f_i h_{i-j}
\]
的式子称为差卷积。
令
\[f_i^{\mathrm{rev}}=f_{n-i},
\]
则下标条件可改写成和固定的普通卷积,再翻转回来即可。
看到 \(i-j\) 且求和范围为 \(i\ge j\) 时,应优先想到“翻转一个序列”。
24. 符号化方法总结
24.1 基本组合类
\[\mathcal E:
\text{唯一的空对象},\qquad E(x)=1;
\]
\[\mathcal Z:
\text{唯一的原子对象},\qquad Z(x)=x.
\]
24.2 构造与生成函数对照
| 组合构造 |
组合含义 |
生成函数 |
| \(\mathcal A+\mathcal B\) |
不相交并 |
\(A(x)+B(x)\) |
| \(\mathcal A\times\mathcal B\) |
两部分组合,大小相加 |
\(A(x)B(x)\) |
| \(\operatorname{SEQ}(\mathcal A)\) |
有序序列 |
\(\dfrac{1}{1-A(x)}\) |
| 有标号 \(\operatorname{SET}(\mathcal A)\) |
无序集合 |
\(\exp(A(x))\) |
| 有标号 \(\operatorname{CYC}(\mathcal A)\) |
环 |
\(\ln\dfrac{1}{1-A(x)}\) |
| 有标号复合 \(\mathcal B\circ\mathcal A\) |
用 \(\mathcal A\) 对象替换 \(\mathcal B\) 的原子 |
\(B(A(x))\) |
| 无标号 \(\operatorname{MSET}(\mathcal A)\) |
可重复无序多重集 |
见 19.1 节 |
| 无标号 \(\operatorname{PSET}(\mathcal A)\) |
不可重复无序子集 |
见 19.2 节 |
| Pointing |
选一个原子作为根 |
\(xA'(x)\) |
其中 \(\operatorname{SEQ}\)、复合以及把 \(A\) 代入 \(\operatorname{SET}\)、\(\operatorname{CYC}\) 时,通常都要求 \(A(0)=0\),否则大小为 \(0\) 的部件会造成无限多种分解。
24.3 OGF 还是 EGF
选择标准不是“题目看起来像哪一种”,而是组合时需要哪一种卷积。
- 若组合两部分只需要大小满足 \(i+j=n\),方案贡献为 \(a_ib_j\),使用 OGF;
- 若还要从 \(n\) 个标号中选择 \(i\) 个分给第一部分,贡献为
\[\binom{n}{i}a_ib_j,
\]
则使用 EGF;
- 概率分布及独立随机变量之和使用 PGF;
- 多个统计量同时出现时,可以使用多元生成函数。
25. 树计数
25.1 Prüfer 序列
\(n\) 个点的有标号无根树与长度为 \(n-2\)、值域为 \({1,\ldots,n}\) 的序列一一对应。
因此 Cayley 公式为
\[\boxed{
n^{n-2}
}.
\]
在 Prüfer 序列中,点 \(i\) 出现的次数为
\[d_i-1,
\]
其中 \(d_i\) 是该点的度数。
所以给定所有点的度数 \(d_1,\ldots,d_n\),合法树数为
\[\boxed{
\frac{(n-2)!}{\prod_{i=1}^{n}(d_i-1)!}
},
\]
前提是
\[d_i\ge1,\qquad
\sum_{i=1}^{n}d_i=2n-2.
\]
25.2 有标号有根树
前面已经由拉格朗日反演得到
\[\boxed{
n^{n-1}
}.
\]
它也等于“先选根,再选一棵无根树”:
\[n\cdot n^{n-2}=n^{n-1}.
\]
25.3 无标号有根树
一棵无标号有根树由:
组成,因此
\[\mathcal T
=\mathcal Z\times\operatorname{MSET}(\mathcal T).
\]
设
\[T(x)=\sum_{n\ge1}t_nx^n,
\]
由 MSET 公式:
\[\boxed{
T(x)
=x\exp\left(
\sum_{k\ge1}\frac{T(x^k)}{k}
\right)
}.
\]
这是无标号树计数中非常典型的自指生成函数。
26. 图计数
26.1 全体有标号简单无向图
\(n\) 个点共有
\[\binom n2
\]
条可能的边,每条边可选或不选,因此图的总数为
\[g_n=2^{\binom n2}.
\]
其 EGF 为
\[G(x)=\sum_{n\ge0}2^{\binom n2}\frac{x^n}{n!}.
\]
26.2 连通图
任意图是若干连通图的无序集合:
\[\mathcal G=\operatorname{SET}(\mathcal C).
\]
所以
\[G(x)=\exp(C(x)),
\]
从而
\[\boxed{
C(x)=\ln G(x)
}.
\]
这给出了有标号连通图数的统一求法。
26.3 同时按点数和边数计数
用 \(x\) 标记点数,用 \(y\) 标记边数。由于点有标号、边只记录数量,使用“对 \(x\) 为 EGF,对 \(y\) 为 OGF”的二元生成函数:
\[\boxed{
G(x,y)
=\sum_{n\ge0}\frac{x^n}{n!}(1+y)^{\binom n2}
}.
\]
其中
\[[x^ny^m]G(x,y)
=\frac{1}{n!}\binom{\binom n2}{m}.
\]
连通图的二元生成函数仍然为
\[\boxed{
C(x,y)=\ln G(x,y)
}.
\]
26.4 偶度图与 Euler 图
\(n\) 个点的偶度图与 \(n-1\) 个点的任意图存在双射,因此偶度图总数为
\[\boxed{
2^{\binom{n-1}{2}}
}.
\]
双射可以直接构造。先任意决定前 \(n-1\) 个点之间的边;然后对每个当前度数为奇数的点 \(i\),补上一条边 \((i,n)\)。这样前 \(n-1\) 个点全部变为偶度。由握手定理,奇度点个数为偶数,因此新点 \(n\) 的度数也为偶数。反过来删掉与点 \(n\) 相连的边,就唯一恢复前 \(n-1\) 个点上的任意图。
若要求连通偶度图,则再利用“全体对象是连通分量的 SET”取对数即可。
27. 生成函数问题的标准分析流程
拿到题目后,可以按下面的顺序思考。
第一步:确定“大小”
明确 \(x^n\) 中的 \(n\) 表示什么:
- 长度;
- 权值和;
- 点数;
- 边数;
- 使用物品数;
- 某个统计量。
若有两个相互独立的统计量,考虑二元生成函数 \(F(x,y)\)。
第二步:确定对象是否带标号
问自己:组合两个大小为 \(i,j\) 的对象时,是否需要额外选择标号?
- 不需要:通常是 OGF;
- 需要乘 \(\binom{i+j}{i}\):通常是 EGF;
- 是概率分布:PGF。
第三步:寻找组合结构
优先检查:
- 分类讨论:加法;
- 两部分组合:乘法;
- 任意长度有序拼接:\(\operatorname{SEQ}\);
- 有标号无序集合:\(\operatorname{SET}\);
- 有标号环:\(\operatorname{CYC}\);
- 连通分量:\(\exp/\ln\);
- 无标号可重复集合:\(\operatorname{MSET}\);
- 递归树结构:隐式方程;
- “恰好”与“至少”:容斥或反演。
第四步:写生成函数方程
不要急着展开系数。先保留整体:
\[F(x)=1+xF(x)^2,
\]
\[F(x)=\frac{1}{1-A(x)},
\]
\[F(x)=\exp(A(x)),
\]
\[F(x)=x\phi(F(x)).
\]
整体形式通常比系数递推更容易观察和变形。
第五步:选择处理工具
| 生成函数形态 |
优先工具 |
| 有理函数 |
部分分式、线性递推、Bostan–Mori |
| \((1-cx)^{-\alpha}\) |
广义二项式定理 |
| \(F=1+xF^2\) 等代数方程 |
解方程、Newton 迭代 |
| \(F=x\phi(F)\) |
拉格朗日反演 |
| \(F=\exp A\) |
求导得到 ODE,或多项式 exp |
| 全体对象由连通分量组成 |
\(C=\ln G\) |
| 无标号多重集 |
Euler 变换 |
| 出现 \(na_n\) |
求导或 \(\vartheta=xD\) |
| 出现 \(i-j\) |
翻转后做差卷积 |
| 出现 \(F(x+c)\) |
多项式平移 |
第六步:检查边界
生成函数推导最容易错在:
- 漏掉 \(a_0,a_1,\ldots\);
- EGF 提取后忘记乘 \(n!\);
- 二次方程选错分支;
- 使用 \(\ln A\) 时 \(A(0)\ne1\);
- 使用 \(A^{-1}\) 时 \(A(0)=0\);
- 使用 \(\exp A\) 时没有处理常数项;
- \(\operatorname{SEQ}\) 中允许了大小为 \(0\) 的部件,导致无限计数;
- 把有标号 SET 与无标号 MSET 混淆。
28. 高频公式总表
28.1 OGF
\[\frac{1}{1-x}
=\sum_{n\ge0}x^n,
\]
\[\frac{1}{1-cx}
=\sum_{n\ge0}c^nx^n,
\]
\[\frac{1}{(1-x)^m}
=\sum_{n\ge0}\binom{n+m-1}{m-1}x^n,
\]
\[\ln\frac{1}{1-x}
=\sum_{n\ge1}\frac{x^n}{n},
\]
\[\frac{1}{\sqrt{1-4x}}
=\sum_{n\ge0}\binom{2n}{n}x^n,
\]
\[\frac{1-\sqrt{1-4x}}{2x}
=\sum_{n\ge0}\frac{1}{n+1}\binom{2n}{n}x^n.
\]
28.2 EGF
\[e^{cx}
=\sum_{n\ge0}c^n\frac{x^n}{n!},
\]
\[\operatorname{SET}(A)
\longleftrightarrow e^{A(x)},
\]
\[\operatorname{SEQ}(A)
\longleftrightarrow \frac{1}{1-A(x)},
\]
\[\operatorname{CYC}(A)
\longleftrightarrow \ln\frac{1}{1-A(x)}.
\]
28.3 二项式
\[(1+x)^\alpha
=\sum_{n\ge0}\binom{\alpha}{n}x^n,
\]
\[\binom{-m}{n}
=(-1)^n\binom{m+n-1}{n},
\]
\[\sum_{i=0}^{k}\binom{n}{i}\binom{m}{k-i}
=\binom{n+m}{k},
\]
\[\sum_{i=0}^{n}\binom{i}{k}
=\binom{n+1}{k+1}.
\]
28.4 特殊数
\[\sum_{n\ge k}
\begin{bmatrix}n\\k\end{bmatrix}
\frac{x^n}{n!}
=\frac{1}{k!}
\left(\ln\frac{1}{1-x}\right)^k,
\]
\[\sum_{n\ge k}
\begin{Bmatrix}n\\k\end{Bmatrix}
\frac{x^n}{n!}
=\frac{(e^x-1)^k}{k!},
\]
\[\frac{x}{e^x-1}
=\sum_{n\ge0}B_n\frac{x^n}{n!},
\]
\[\sum_{n\ge0}p(n)x^n
=\prod_{k\ge1}\frac{1}{1-x^k}.
\]
28.5 概率生成函数
\[F(1)=1,
\]
\[\mathbb E[X]=F'(1),
\]
\[\mathbb E[X^{\underline k}]=F^{(k)}(1),
\]
\[\operatorname{Var}(X)
=F''(1)+F'(1)-F'(1)^2.
\]
29. 建议学习顺序
第一阶段:只学会“读系数”
掌握:
- \([x^n]\);
- OGF 加法与乘法;
- 几何级数;
- 平移与拉伸;
- 背包生成函数。
练习目标:看到
\[\frac{1}{(1-x)(1-x^2)(1-x^5)}
\]
能解释每个因子的组合意义。
第二阶段:递推与常见闭式
掌握:
- 从递推式建立 OGF;
- 初值修正;
- 有理生成函数;
- 广义二项式定理;
- 卡塔兰数。
练习目标:独立推导斐波那契和卡塔兰数生成函数。
第三阶段:OGF 与 EGF 的组合意义
掌握:
- OGF 普通卷积;
- EGF 二项卷积;
- SEQ、SET、CYC;
- 置换、错排、连通结构。
练习目标:看到“有标号对象的无序集合”时能立即写出 \(\exp\)。
第四阶段:特殊数与反演
掌握:
- 两类斯特林数;
- 二项式反演;
- 差分与牛顿级数;
- 伯努利数;
- 整数分拆。
练习目标:能在普通幂、下降幂、集合划分、环排列之间切换。
第五阶段:进阶多项式工具
掌握:
- 求逆、\(\ln\)、\(\exp\)、幂、开方;
- Newton 迭代;
- 拉格朗日反演;
- ODE 与系数递推;
- 多项式平移;
- Euler 变换。
练习目标:从组合结构方程直接选择合适的多项式算法。
30. 最后总结
生成函数最值得形成的不是一张孤立公式表,而是一条稳定的思维链:
\[\boxed{
\text{组合对象}
\longrightarrow
\text{大小与标号}
\longrightarrow
\text{组合构造}
\longrightarrow
\text{生成函数方程}
\longrightarrow
\text{代数或多项式算法}
\longrightarrow
\text{系数答案}
}.
\]
其中最关键的几个统一认识是:
- OGF 的乘法就是普通背包卷积。
- EGF 的 \(1/n!\) 用来吸收标号分配产生的组合数。
- \(\operatorname{SEQ}\)、\(\operatorname{SET}\)、\(\operatorname{CYC}\) 分别对应 \(\frac1{1-A}\)、\(e^A\)、\(\ln\frac1{1-A}\)。
- 广义二项式定理统一产生绝大多数二项式系数幂级数。
- 求导把下标 \(n\) 带进系数,积分把它除掉。
- 常系数线性递推对应有理生成函数。
- 隐式方程 \(F=x\phi(F)\) 优先考虑拉格朗日反演。
- 全体有标号对象由连通分量组成时,连通部分等于全体 EGF 的对数。
- 无标号可重复集合使用 MSET/Euler 变换,不能直接套有标号 SET。
- 最终一定检查初值、常数项、分支选择和 EGF 的 \(n!\)。
如果这些联系已经形成,许多看似需要硬记的生成函数公式都会变成可以现场重新推导的结论。