Part 1
定义序列 a a a的普通生成函数(OGF)为: F ( x ) = ∑ a n x n F(x)=\sum a_nx^n F(x)=∑anxn。 a a a既可以是有穷数列,也可以是无穷数列。
封闭形式:例如,考虑等比数列 ⟨ 1 , p , p 2 , . . . ⟩ \left \langle 1,p,p^2,... \right \rangle ⟨1,p,p2,...⟩的生成函数 F ( x ) = ∑ p n x n F(x)=\sum p^nx^n F(x)=∑pnxn,有
F ( x ) p x + 1 = F ( x ) F ( x ) = 1 1 − p x F(x)px+1=F(x)\\F(x)=\frac{1}{1-px} F(x)px+1=F(x)F(x)=1−px1
等比数列的封闭形式和展开形式都非常有用。[AGC058D] Yet Another ABC String
斐波那契数列的生成函数:定义 a 0 = 0 , a 1 = 1 , a n = a n − 1 + a n − 2 a_0=0,a_1=1,a_n=a_{n-1}+a_{n-2} a0=0,a1=1,an=an−1+an−2,设数列 a a a的OGF是 F ( x ) F(x) F(x),可以根据递推式列出方程:
F ( x ) = x F ( x ) + x 2 F ( x ) + x F ( x ) = x 1 − x − x 2 F(x)=xF(x)+x^2F(x)+x \\F(x)=\frac{x}{1-x-x^2} F(x)=xF(x)+x2F(x)+xF(x)=1−x−x2x
考虑求解一个待定系数方程:
A 1 − a x + B 1 − b x = x 1 − x − x 2 \frac{A}{1-ax}+\frac{B}{1-bx}=\frac{x}{1-x-x^2} 1−axA+1−bxB=1−x−x2x
根据等比数列的展开式,可以得到斐波那契数列的展开式(通项公式):
x 1 − x − x 2 = ∑ n ≥ 0 x n 1 5 ( ( 1 + 5 2 ) n − ( 1 − 5 2 ) n ) \frac{x}{1-x-x^2}=\sum_{n\ge 0} x^n\frac{1}{\sqrt{5}}\left( \left(\frac{1+\sqrt{5}}{2}\right)^n-\left(\frac{1-\sqrt{5}}{2}\right)^n\right) 1−x−x2x=n≥0∑xn51((21+5)n−(21−5)n)
PS:对于多项式 P ( x ) , Q ( x ) P(x),Q(x) P(x),Q(x),生成函数 P ( x ) Q ( x ) \frac{P(x)}{Q(x)} Q(x)P(x)的通项公式可以用待定系数方法求出。方法是将 Q ( x ) Q(x) Q(x)因式分解。
定义 S E Q A SEQ_A SEQA是 A A A中元素排成的序列 组成的集合,一个序列的大小定义为各元素大小之和,那么 S E Q A SEQ_A SEQA的 O G F OGF OGF:
S E Q A ( x ) = 1 + A ( x ) + A 2 ( x ) + . . . + A n ( x ) = 1 1 − A ( x ) SEQ_A(x)=1+A(x)+A^2(x)+...+A^n(x)=\frac{1}{1-A(x)} SEQA(x)=1+A(x)+A2(x)+...+An(x)=1−A(x)1 。
Part 2
背包计数问题:有 k k k种物品,每种物品有容量 v i v_i vi和数量 n i n_i ni,问组合出容量为 V V V的方案数。
F ( x ) = ∏ i = 1 k ( 1 + x v i + x 2 v i + . . . + x n i v i ) = ∏ i = 1 k 1 − x ( n i + 1 ) v i 1 − x v i F(x)=\prod_{i=1}^k(1+x^{v_i}+x^{2v_i}+...+x^{n_iv_i})=\prod_{i=1}^k\frac{1-x^{(n_i+1)v_i}}{1-x^{v_i}} F(x)=∏i=1k(1+xvi+x2vi+...+xnivi)=∏i=1k1−xvi1−x(ni+1)vi
假设背包有无穷种物品,每种物品的体积为 i i i,个数也无限,把 n n n的正整数拆分的方案数记作 p ( n ) p(n) p(n), p p p也叫分拆数。
不难得到 p ( n ) p(n) p(n)的生成函数: F ( x ) = ∏ i = 1 ∞ 1 1 − x i F(x)=\prod_{i=1}^{\infty}\frac{1}{1-x^i} F(x)=∏i=1∞1−xi1
两边取对数,有 ln F ( x ) = − ∑ i = 1 ∞ ln ( 1 − x i ) \ln F(x)=-\sum_{i=1}^{\infty}\ln(1-x^i) lnF(x)=−∑i=1∞ln(1−xi)
在 m o d x n + 1 \bmod \ x^{n+1} mod xn+1意义下可以把无穷和变为有限的(或者理解为只加入 ≤ n \le n ≤n的物品): ln F ( x ) = − ∑ i = 1 n ln ( 1 − x i ) \ln F(x)=-\sum_{i=1}^n\ln(1-x^i) lnF(x)=−∑i=1nln(1−xi)
求右边的麦克劳林展式:
ln F ( x ) = − ∑ i = 1 n ln ( 1 − x i ) = ∑ i = 1 n ∑ j = 1 ∞ x i j j = ∑ j = 1 ∞ 1 j ∑ i = 1 n x i j = ∑ j = 1 n 1 j ∑ i = 1 ⌊ n j ⌋ x i j \ln F(x)=-\sum_{i=1}^n\ln(1-x^i)=\sum_{i=1}^n\sum_{j=1}^{\infty}\frac{x^{ij}}{j}=\sum_{j=1}^\infty\frac{1}{j}\sum_{i=1}^nx^{ij}=\sum_{j=1}^n\frac{1}{j}\sum_{i=1}^{\lfloor\frac{n}{j}\rfloor}x^{ij} lnF(x)=−∑i=1nln(1−xi)=∑i=1n∑j=1∞jxij=∑j=1∞j1∑i=1nxij=∑j=1nj1∑i=1⌊jn⌋xij
右边和式可以处理出来,再对其求多项式 exp \exp exp即可,复杂度 O ( n log n ) O(n\log n) O(nlogn)。
显然,对于一般的背包计数问题,也可以用上述方式进行求解。
Part 3
定义序列 a a a的指数生成函数(EGF)为: F ^ ( x ) = ∑ a n x n n ! \widehat F(x)=\sum a_n\frac{x^n}{n!} F (x)=∑ann!xn
EGF 通常用来解决带标号的计数问题。
一次积分相当于右移一项,一次求导相当于左移一项(对 a a a序列而言)。
理解任意两个 E G F EGF EGF的乘积:
对于两个序列 a , b a,b a,b,设它们的指数生成函数分别为 F ^ ( x ) , G ^ ( x ) \widehat F(x),\widehat G(x) F (x),G (x),那么:
F ^ ( x ) G ^ ( x ) = ∑ n ≥ 0 x n n ! ∑ i = 0 n ( n i ) a i b n − i \widehat F(x)\widehat G(x)=\sum_{n\ge 0}\frac{x^n}{n!}\sum_{i=0}^n\binom{n}{i}a_ib_{n-i} F (x)G (x)=n≥0∑n!xni=0∑n(in)aibn−i
因此 F ^ ( x ) G ^ ( x ) \widehat F(x)\widehat G(x) F (x)G (x)是序列 ⟨ ∑ i = 0 n ( n i ) a i b n − i ⟩ \left \langle \sum_{i=0}^n\binom{n}{i}a_ib_{n-i} \right \rangle ⟨∑i=0n(in)aibn−i⟩的指数生成函数。
一个容易产生的误区是,上述序列才是我们真正的研究对象。而研究其对应的EGF显得更为方便,因此最终提取答案时每一项要乘上 i ! i! i!。
关于组合意义,可以理解为:有 n + m n+m n+m个带标号的元素,选择其中 n n n个元素放入 F ^ \widehat F F 集合中(内部已经分配标号),另 m m m个元素放入 G ^ \widehat G G 集合中, F ^ , G ^ \widehat F,\widehat G F ,G 集合互不相同(换句话说,集合带标号),因此要乘上分配的方案数 ( n + m n ) \binom{n+m}{n} (nn+m)。
EGF中多项式 exp \text{exp} exp的的组合意义:表示把 n n n个有标号元素划分成 k > 0 k>0 k>0个无标号集合的方案数。
证明: [ x n ] F ^ k ( x ) [x^n]\widehat F^k(x) [xn]F k(x)表示把 n n n个有标号元素划分成 k k k个有标号集合的方案数,而对于同一种方案有 k ! k! k!种集合标号的方式,因此乘上系数 1 k ! \frac{1}{k!} k!1。
这里要求 f 0 = 0 f_0=0 f0=0。显然,如果 f 0 ≠ 0 f_0\ne 0 f0=0,那么会出现算重的情况。同理,当做多项式 ln \ln ln时,也应当要求 f 0 = 1 f_0=1 f0=1。
排列与圆排列:长度为
n
n
n的排列数的EGF是
P
^
(
x
)
=
∑
n
≥
0
n
!
x
n
n
!
=
∑
n
≥
0
x
n
=
1
1
−
x
\widehat P(x)=\sum_{n\ge 0}\frac{n!x^n}{n!}=\sum_{n\ge 0}x^n=\frac{1}{1-x}
P
(x)=n≥0∑n!n!xn=n≥0∑xn=1−x1
圆排列的EGF是
Q
^
(
x
)
=
∑
n
≥
1
(
n
−
1
)
!
x
n
n
!
=
∑
n
≥
1
x
n
n
=
−
ln
(
1
−
x
)
=
ln
(
1
1
−
x
)
\widehat Q(x)=\sum_{n\ge 1}\frac{(n-1)!x^n}{n!}=\sum_{n\ge 1}\frac{x^n}{n}=-\ln(1-x)=\ln(\frac{1}{1-x})
Q
(x)=n≥1∑n!(n−1)!xn=n≥1∑nxn=−ln(1−x)=ln(1−x1)
因此 Q ^ ( x ) \widehat Q(x) Q (x)的 exp \text{exp} exp就是 P ^ ( x ) \widehat P(x) P (x)。这非常显然,因为一个排列可以拆分成若干个置换环,而置换环的数目和圆排列的数目是相同的。这同时也说明了封闭形式的优越性。
推广之
- 如果 n n n个点带标号生成树的EGF是 F ^ ( x ) \widehat F(x) F (x),那么 n n n个点带标号生成森林的EGF就是 exp ( F ^ ( x ) ) \text{exp}(\widehat F(x)) exp(F (x))。
- 如果 n n n个点带标号无向连通图的EGF是 F ^ ( x ) \widehat F(x) F (x),那么任意带标号无向图的EGF就是 exp ( F ^ ( x ) ) \text{exp}(\widehat F(x)) exp(F (x)),因此
exp ( F ^ ( x ) ) = ∑ n ≥ 0 2 ( n 2 ) x n n ! \text{exp}(\widehat F(x))=\sum_{n\ge 0}2^{\binom{n}{2}}\frac{x^n}{n!} exp(F (x))=n≥0∑2(2n)n!xn
只需一次多项式 ln \ln ln即可。
实战:[ABC236Ex] Distinct Multiples
集合划分问题:集合 S S S的一个划分是把 S S S分成两两不相交的非空子集,并且它们的并是 S S S。
bell \text{bell} bell数 B n B_n Bn是基数为 n n n的集合划分数目,显然 B n B_n Bn的 EGF 就是 exp ( exp ( x ) − 1 ) \exp(\exp(x)-1) exp(exp(x)−1)。
Part 4
斯特林数相关,其实就是一堆板子,用处不大。但是还是留在这里了。
第二类斯特林数: { n m } \begin{Bmatrix}n \\ m\end{Bmatrix} {nm}表示将 n n n个有标号元素划分称 m m m个无标号集合的方案数。
我们可以写出第二类斯特林数的 E G F EGF EGF:
∑ n ≥ 0 { n m } x n n ! = ( exp ( x ) − 1 ) m m ! \sum_{n\ge 0}\begin{Bmatrix}n \\ m\end{Bmatrix}\frac{x^n}{n!}=\frac{(\exp(x)-1)^m}{m!} n≥0∑{nm}n!xn=m!(exp(x)−1)m
可以 O ( n log n ) O(n\log n) O(nlogn)计算多项式快速幂。
通项公式(可以用二项式反演证明):
{ n m } = ∑ i = 0 m ( − 1 ) m − i i n i ! ( m − i ) ! \begin{Bmatrix}n \\ m\end{Bmatrix}=\sum_{i=0}^m\frac{(-1)^{m-i}i^n}{i!(m-i)!} {nm}=i=0∑mi!(m−i)!(−1)m−iin
可以直接卷积计算。
第一类 Sirling \text{Sirling} Sirling数: [ n m ] \begin{bmatrix}n \\ m\end{bmatrix} [nm]表示将 n n n个有标号元素划分为 m m m个互不区分的非空轮换的方案数。
递推式: [ n m ] = [ n − 1 m − 1 ] + ( n − 1 ) [ n − 1 m ] \begin{bmatrix}n \\ m\end{bmatrix}=\begin{bmatrix}n-1 \\ m-1\end{bmatrix}+(n-1)\begin{bmatrix}n-1 \\ m\end{bmatrix} [nm]=[n−1m−1]+(n−1)[n−1m]
记 F n ( x ) = ∑ i = 0 n [ n i ] x i F_n(x)=\sum_{i=0}^n\begin{bmatrix}n \\ i\end{bmatrix}x^i Fn(x)=∑i=0n[ni]xi
根据递推公式: F n ( x ) = ( n − 1 ) F n − 1 ( x ) + x F n − 1 ( x ) F_n(x)=(n-1)F_{n-1}(x)+xF_{n-1}(x) Fn(x)=(n−1)Fn−1(x)+xFn−1(x)
于是
F
n
(
x
)
=
∏
i
=
0
n
−
1
(
x
+
i
)
F_n(x)=\prod_{i=0}^{n-1}(x+i)
Fn(x)=i=0∏n−1(x+i)
这其实是 x x x的 n n n次上升阶乘幂,记作 x n ‾ x^{\overline n} xn。用上升幂相关做法可以 O ( n log n ) O(n\log n) O(nlogn)求出(当然也可以简单暴力分治求)。
显然,单个轮换的 EGF 为 F ( x ) = ∑ i = 1 n ( i − 1 ) ! x i i ! F(x)=\sum_{i=1}^n\frac{(i-1)!x^i}{i!} F(x)=∑i=1ni!(i−1)!xi
它的 k k k次幂就是 [ n k ] \begin{bmatrix}n \\ k\end{bmatrix} [nk]的 EGF(提取时要乘上 n ! k ! \frac{n!}{k!} k!n!), O ( n log n ) O(n\log n) O(nlogn)计算即可。
上升幂的计算:
考虑倍增, x 2 n ‾ = x n ‾ ( x + n ) n ‾ x^{\overline {2n}}=x^{\overline n}(x+n)^{\overline n} x2n=xn(x+n)n
于是现在我们有多项式 f ( x ) f(x) f(x),要求 f ( x + c ) f(x+c) f(x+c)的值
不难得到 f ( x + c ) f(x+c) f(x+c)可以二项式展开然后卷积求出。
复杂度 O ( n log n ) O(n\log n) O(nlogn) 。
用上升幂求第二类斯特林数的列:
利用递推式 { n m } = { n − 1 m − 1 } + m { n − 1 m } \begin{Bmatrix}n \\ m\end{Bmatrix}=\begin{Bmatrix}n-1 \\ m-1\end{Bmatrix}+m\begin{Bmatrix}n-1 \\ m\end{Bmatrix} {nm}={n−1m−1}+m{n−1m}
设 F k ( x ) = ∑ i = 0 ∞ { i k } x i F_k(x)=\sum_{i=0}^{\infty}\begin{Bmatrix}i \\ k\end{Bmatrix}x^i Fk(x)=∑i=0∞{ik}xi
不难发现 F k ( x ) = x F k − 1 ( x ) + k x F k ( x ) F_k(x)=xF_{k-1}(x)+kxF_k(x) Fk(x)=xFk−1(x)+kxFk(x),那么 F k ( x ) = x 1 − k x F k − 1 ( x ) F_k(x)=\frac{x}{1-kx}F_{k-1}(x) Fk(x)=1−kxxFk−1(x)
那么 F k ( x ) = ∏ i = 1 k x 1 − i x = x k ( ∏ i = 1 k ( 1 − i x ) ) − 1 F_k(x)=\prod_{i=1}^k\frac{x}{1-ix}=x^k(\prod_{i=1}^k(1-ix))^{-1} Fk(x)=∏i=1k1−ixx=xk(∏i=1k(1−ix))−1
考虑算 ∏ i = 1 k ( 1 − i x ) \prod_{i=1}^k(1-ix) ∏i=1k(1−ix)。
∏ i = 1 k ( 1 − i x ) = x k ∏ i = 1 k ( x − 1 − i ) \prod_{i=1}^k(1-ix)=x^k\prod_{i=1}^k(x^{-1}-i) ∏i=1k(1−ix)=xk∏i=1k(x−1−i)
注意到 ∏ i = 1 k ( x − i ) \prod_{i=1}^k(x-i) ∏i=1k(x−i)翻转后就能得到 x k ∏ i = 1 k ( x − 1 − i ) x^k\prod_{i=1}^k(x^{-1}-i) xk∏i=1k(x−1−i)
那么算 ∏ i = 1 k ( x − i ) = x k + 1 ‾ x \prod_{i=1}^k(x-i)=\frac{x^{\underline {k+1}}}{x} ∏i=1k(x−i)=xxk+1 即可。
复杂度 O ( n log n ) O(n\log n) O(nlogn)。
Part 5
概率生成函数:如果 X X X是非负整数集 N N N上的离散随机变量,那么 X X X的概率生成函数为
F ( z ) = E ( z X ) = ∑ i = 0 ∞ P r ( X = i ) z i F(z)=E(z^X)=\sum_{i=0}^{\infty}Pr(X=i)z^i F(z)=E(zX)=i=0∑∞Pr(X=i)zi
显然,只能处理非负整数集上的情况。
因为 X X X是非负整数集 N N N上的离散随机变量,所以必有 F ( 1 ) = ∑ i = 0 ∞ P r ( X = i ) = 1 F(1)=\sum_{i=0}^{\infty}Pr(X=i)=1 F(1)=∑i=0∞Pr(X=i)=1。
对 F ( z ) F(z) F(z)求导,得到 F ′ ( z ) = ∑ i = 0 ∞ i P r ( X = i ) z i − 1 F'(z)=\sum_{i=0}^{\infty}iPr(X=i)z^{i-1} F′(z)=∑i=0∞iPr(X=i)zi−1,所以 X X X的期望 E ( x ) = F ′ ( 1 ) = ∑ i = 0 ∞ i P r ( X = i ) E(x)=F'(1)=\sum_{i=0}^{\infty}iPr(X=i) E(x)=F′(1)=∑i=0∞iPr(X=i)。可以类比得到 E ( X k ‾ ) = F ( k ) ( 1 ) , k ≠ 0 E(X^{\underline{k}})=F^{(k)}(1),k\ne 0 E(Xk)=F(k)(1),k=0。所以 X X X的方差 D ( X ) = E ( X 2 ) − E 2 ( X ) = F ′ ′ ( 1 ) + F ′ ( 1 ) − ( F ′ ( 1 ) ) 2 D(X)=E(X^2)-E^2(X)=F''(1)+F'(1)-(F'(1))^2 D(X)=E(X2)−E2(X)=F′′(1)+F′(1)−(F′(1))2。
给你一个字符串 A A A,和一个初始为空的字符串 B B B,每次从 m m m个字符中随机选一个插入到 B B B的末尾直到 B B B字符串中包含 A A A,求 B B B的期望长度。
令 a i a_i ai表示 A [ 1 , i ] A[1,i] A[1,i]是否为 A A A的一个 border \text{border} border, f i f_i fi为结束时随机序列长度为 i i i的概率,其概率生成函数为 F ( x ) F(x) F(x)。考虑构造辅助数组 g i g_i gi为随机序列长度到达 i i i且还未结束的概率,其生成函数为 G ( x ) G(x) G(x)。
那么有如下等式: F ( x ) + G ( x ) = 1 + x ⋅ G ( x ) F(x)+G(x)=1+x\cdot G(x) F(x)+G(x)=1+x⋅G(x)。
但是只有一个等式显然是无法求解的。考虑算二次的思想,在一个任意串后面接上串 A A A,如果在某一位置停下了,那么我们就可以据此构造出一段 border \text{border} border(这可以形象的理解为从前面截断和从后面截断),那么有 G ( x ) ⋅ ( 1 m x ) L = ∑ a i ⋅ F ( x ) ⋅ ( 1 m x ) L − i G(x)\cdot (\frac{1}{m}x)^L=\sum a_i\cdot F(x)\cdot (\frac{1}{m}x)^{L-i} G(x)⋅(m1x)L=∑ai⋅F(x)⋅(m1x)L−i。(左边式子有 x x x注意不要抄掉了)
将第一个式子求导, F ′ ( x ) + G ′ ( x ) = x G ′ ( x ) + G ( x ) F'(x)+G'(x)=xG'(x)+G(x) F′(x)+G′(x)=xG′(x)+G(x),将 x = 1 x=1 x=1代入得到 F ′ ( 1 ) = G ( 1 ) F'(1)=G(1) F′(1)=G(1),再将 x = 1 x=1 x=1代入第二个式子得到 G ( 1 ) = ∑ a i ⋅ m i G(1)=\sum a_i\cdot m^i G(1)=∑ai⋅mi,我们要求的就是 F ′ ( 1 ) F'(1) F′(1),这道题就做完了。
求其中某一项可以用多项式求逆解决。有时间我再推一下。
继续实战:[SDOI2017] 硬币游戏
[ZJOI2019] 开关(这不是FWT经典题吗,气抖冷)
upd on 2023/12/26:新增了一些自己的理解以及若干例题。