【笔记】生成函数 · 进阶(EGF)
写在前面
本文除了例题 @.1 P4389 付公主的背包 使用 OGF 其她的均为 EGF
0 约定
0.1 一些形象的表达
- 收缩: 指一个式子由比较复杂的形式变简单。本文中大概率就是指一个生成函数用封闭形式来表达;
- 多项式的平移: 对于任意一个多项式 \(A(x)\),向左平移 \(m\) 位指 \(\left(A(x)-\sum\limits_{i=0}^{m-1}a_ix^i\right)/x^m\);向右平移 \(m\) 位指 \(A(x)\times x^m\);
0.2 记号
- 如果没有特别说明,大写字母一般表示其小写字母的生成函数的封闭形式。
1 封闭形式的生成
- 由递推式生成: 将等式两边同时乘上形式元 \(z^n\) 并对 \(n\ge 0\) 求和。然后分开收缩之后再求和;
- 由数列生成: 将原数列的生成函数 \(F(x)\) 向右平移 \(1\) 位,然后求 \(xF(x)-F(x)\),从而列出方程求解;
- 由多个生成函数运算生成:
- 复合: 直接带入就行;
- 两个生成函数以卷积形式相乘,就等价于她们的封闭形式相乘。
- 其她的,按运算法则算就好;
由一个封闭形式推另一个封闭形式的时候,系数中的 \(n\) 一定要转移到 \(z\) 的指数上去(大概率是求导。
2 指数生成函数 EGF
我们称满足如下形式的形式幂级数为 指数生成函数 (Exponential Generating Function, EGF)
特别地,我们会用 \(\left[\frac {z^n}{n!}\right]\) 来直接提取 \(a_n\),而若用 \([z^n]\) 的话提取到的是 \(\frac {a_n}{n!}\) 。
也就是说 \(\left[\frac {z^n}{n!}\right]\) 和 \(n![z^n]\) 是等价的。
值得注意的是,EGF 的原生数列(系数数列),指的是用 \([z^n]\) 提取的值,是包含 \(n!\) 的。
2.1 运算法则
-
\(z^m\hat A(z)\) 在 OGF 的语境下为平移;而在 EGF 下,由于 \(n!\) 并不会改变,所以并不是直接平移,最终的数列应该是 \(\{a_{n-m}\cdot \frac {n!}{(n-m)!} \}\)。
-
\(\hat A^\prime(z)\) 在 OGF 的语境下为带系数的移位,生成 \(\{(n+1)a_{n+1} \}\);而在 EGF 中,就是真正的向左平移(一位)了,而 \(\int_{0}^{z} \hat{A}(t) \mathrm{d} t\) 也就是向右平移了。
-
$\hat{C}(z)=\hat{A}(z) \hat{B}(z) $$ 在 OGF 语境下为普通卷积,在 EGF 语境下为二项卷积,也即:
\[c_{n}=\sum_{k}\binom{n}{k} a_{k} b_{n-k} \]
@ 例题
@.1 P4389 付公主的背包
用 dp 递推式生成封闭形式,再快速求解
定义 \(f_{i,j}\) 前 \(i\) 个物品,凑出容量为 \(j\) 的方案数。
有递推式:
然后用 1.1 的手法,配一个形式元上去:
进而:
后续的“计算”和生成函数本身无关。
@.2 贝尔数
将 \(\{1,2,3,\dots,n\}\) 划分为若干个非空子集的方案数 \(\omega_n\) 称为 贝尔数。
考虑 \(1\) 所在的子集,写出如下转移式:
这实际上是划分集合的惯用 trick,即考虑一个特定元素最终所在集合。
继续用 1.1 的手法尝试:
发现 \({n-1\choose i}z^i\) 不能直接收拢欸。
注意到我们现在能继续的变形,只能把组合数拆成阶乘:
然后我们惊奇的发现,这三坨求和其实就是 EGF。
……