【学习笔记】生成函数入门

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)=1px1

等比数列的封闭形式和展开形式都非常有用。[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=an1+an2,设数列 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)=1xx2x

考虑求解一个待定系数方程:

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} 1axA+1bxB=1xx2x

根据等比数列的展开式,可以得到斐波那契数列的展开式(通项公式):

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) 1xx2x=n0xn5 1((21+5 )n(215 )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)=1A(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=1k1xvi1x(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=11xi1

两边取对数,有 ln ⁡ F ( x ) = − ∑ i = 1 ∞ ln ⁡ ( 1 − x i ) \ln F(x)=-\sum_{i=1}^{\infty}\ln(1-x^i) lnF(x)=i=1ln(1xi)

  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(1xi)

求右边的麦克劳林展式:

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(1xi)=i=1nj=1jxij=j=1j1i=1nxij=j=1nj1i=1jnxij

右边和式可以处理出来,再对其求多项式 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)=n0n!xni=0n(in)aibni

因此 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)aibni的指数生成函数。

一个容易产生的误区是,上述序列才是我们真正的研究对象。而研究其对应的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)=n0n!n!xn=n0xn=1x1

圆排列的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)=n1n!(n1)!xn=n1nxn=ln(1x)=ln(1x1)

因此 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))=n02(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!} n0{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=0mi!(mi)!(1)miin

可以直接卷积计算。

第一类 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]=[n1m1]+(n1)[n1m]

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)=(n1)Fn1(x)+xFn1(x)

于是
F n ( x ) = ∏ i = 0 n − 1 ( x + i ) F_n(x)=\prod_{i=0}^{n-1}(x+i) Fn(x)=i=0n1(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!(i1)!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}={n1m1}+m{n1m}

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)=xFk1(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)=1kxxFk1(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=1k1ixx=xk(i=1k(1ix))1

考虑算 ∏ i = 1 k ( 1 − i x ) \prod_{i=1}^k(1-ix) i=1k(1ix)

∏ 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(1ix)=xki=1k(x1i)

注意到 ∏ i = 1 k ( x − i ) \prod_{i=1}^k(x-i) i=1k(xi)翻转后就能得到 x k ∏ i = 1 k ( x − 1 − i ) x^k\prod_{i=1}^k(x^{-1}-i) xki=1k(x1i)

那么算 ∏ i = 1 k ( x − i ) = x k + 1 ‾ x \prod_{i=1}^k(x-i)=\frac{x^{\underline {k+1}}}{x} i=1k(xi)=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=0Pr(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=0Pr(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=0iPr(X=i)zi1,所以 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=0iPr(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

实战:[CTSC2006] 歌唱王国

给你一个字符串 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+xG(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=aiF(x)(m1x)Li。(左边式子有 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)=aimi,我们要求的就是 F ′ ( 1 ) F'(1) F(1),这道题就做完了。

求其中某一项可以用多项式求逆解决。有时间我再推一下。

继续实战:[SDOI2017] 硬币游戏

[ZJOI2019] 开关(这不是FWT经典题吗,气抖冷)

upd on 2023/12/26:新增了一些自己的理解以及若干例题。

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值