组合数学——生成函数

生成函数

生成函数(generating function),又称母函数,是一种形式幂级数,其每一项的系数可以提供关于这个序列的信息。

生成函数有许多不同的种类,但大多可以表示为单一的形式:

F ( x ) = ∑ n = 0 ∞ a n k n ( x ) F(x) = \sum_{n=0}^{\infty}a_{n}k_{n}(x) F(x)=n=0ankn(x)

其中 a n a_{n} an是数列的第 n n n项, k n ( x ) k_{n}(x) kn(x)被称为核函数,不同的核函数决定了不同类型的生成函数。生成函数既可以是有限的,也可以是无限的。

其中,根据核函数的不同,生成函数大致分为:

  1. 普通型生成函数: k n ( x ) = x n k_{n}(x)=x^{n} kn(x)=xn
  2. 指数型生成函数: k n ( x ) = x n n ! k_{n}(x)=\frac{x^{n}}{n!} kn(x)=n!xn
  3. 狄利克雷生成函数: k n ( x ) = 1 x n k_{n}(x)=\frac{1}{x^{n}} kn(x)=xn1

其中,最常用的为普通型生成函数,本文围绕普通型生成函数展开讨论。

普通型生成函数

普通型生成函数定义为幂级数的形式:

F ( x ) = ∑ n = 0 ∞ a n x n F(x) = \sum_{n=0}^{\infty}a_{n}x^{n} F(x)=n=0anxn

通常假设数列以 a 0 a_{0} a0开始。

给出几个常见的生成函数:

  1. 有限项生成函数: a = { 1 , 2 , 3 } a=\{1,2,3\} a={1,2,3} F ( x ) = 1 + 2 x + 3 x 2 F(x)=1 + 2x+3x^{2} F(x)=1+2x+3x2
  2. 1 1 1序列生成函数: a = { 1 , 1 , 1 , … } a=\{1,1,1,\ldots\} a={1,1,1,} F ( x ) = ∑ n = 0 ∞ x n F(x)=\sum_{n=0}^{\infty}x^{n} F(x)=n=0xn
  3. 2 2 2的幂次生成函数: a = { 1 , 2 , 4 , , 8 … } a=\{1,2,4,,8\ldots\} a={1,2,4,,8} F ( x ) = ∑ n = 0 ∞ 2 n x n F(x)=\sum_{n=0}^{\infty}2^{n}x^{n} F(x)=n=02nxn
  4. 奇数生成函数: a = { 1 , 3 , 5 , , 7 … } a=\{1,3,5,,7\ldots\} a={1,3,5,,7} F ( x ) = ∑ n = 0 ∞ ( 2 n + 1 ) x n F(x)=\sum_{n=0}^{\infty}(2n+1)x^{n} F(x)=n=0(2n+1)xn

换句话说,如果 a n a_{n} an有通项公式,那么幂级数的形式很容易写出。

基本运算

加法运算

考虑两个序列 a , b a,b a,b 的普通生成函数,分别为 F ( x ) , G ( x ) F(x),G(x) F(x),G(x)。那么有

F ( x ) ± G ( x ) = ∑ n = 0 ∞ ( a n ± b n ) x n F(x)\pm G(x)=\sum_{n=0}^{\infty} (a_n\pm b_n)x^n F(x)±G(x)=n=0(an±bn)xn

因此 F ( x ) ± G ( x ) F(x)\pm G(x) F(x)±G(x) 是序列 ⟨ a n ± b n ⟩ \langle a_n\pm b_n\rangle an±bn 的普通生成函数。

乘法运算(卷积)

考虑乘法运算,也就是卷积:

F ( x ) G ( x ) = ∑ n = 0 ∞ x n ∑ i = 0 n a i b n − i F(x)G(x)=\sum_{n=0}^{\infty} x^n \sum_{i=0}^na_ib_{n-i} F(x)G(x)=n=0xni=0naibni

因此 F ( x ) G ( x ) F(x)G(x) F(x)G(x) 是序列 ⟨ ∑ i = 0 n a i b n − i ⟩ \langle \sum_{i=0}^n a_ib_{n-i} \rangle i=0naibni 的普通生成函数。

注意:序列 ⟨ ∑ i = 0 n a i b n − i ⟩ \langle \sum_{i=0}^n a_ib_{n-i} \rangle i=0naibni满足一般乘法,加法原理。这是以后卷积运算在排列组合中的内部原理。

幂级数的封闭

有时,我们做两个无穷幂级数的卷积的时候,对于无穷多项多项式做卷积是一件很困难的事,我们可以用幂级数的收敛值来代替幂级数做卷积运算。

这种方法称为幂级数的封闭

例如 ⟨ 1 , 1 , 1 , ⋯   ⟩ \langle 1,1,1,\cdots\rangle 1,1,1, 的普通生成函数 F ( x ) = ∑ n = 0 ∞ x n F(x)=\sum_{n=0}^{\infty}x^n F(x)=n=0xn,我们可以发现

F ( x ) x + 1 = F ( x ) F(x)x+1=F(x) F(x)x+1=F(x)

那么解这个方程得到

F ( x ) = 1 1 − x F(x)=\frac{1}{1-x} F(x)=1x1

这就是 ∑ n = 0 ∞ x n \sum_{n = 0}^{\infty}x^n n=0xn 的封闭形式。

注意:上式等号仅在收敛域内成立。

考虑等比数列 ⟨ 1 , p , p 2 , p 3 , p 4 , ⋯   ⟩ \langle 1,p,p^2,p^3,p^4,\cdots\rangle 1,p,p2,p3,p4, 的生成函数 F ( x ) = ∑ n ≥ 0 p n x n F(x)=\sum_{n\ge 0}p^nx^n F(x)=n0pnxn,有

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

等比数列的封闭形式与展开形式是常用的变换手段。

除了上述两个下列给出几种常见的封闭运算:

求导型

a = ⟨ 1 , 2 , 3 , 4 , ⋯   ⟩ a=\langle 1,2,3,4,\cdots \rangle a=1,2,3,4,

第三个(求导):

F ( x ) = ∑ n ≥ 0 ( n + 1 ) x n = ∑ n ≥ 1 n x n − 1 = ∑ n ≥ 0 ( x n ) ′ = ( 1 1 − x ) ′ = 1 ( 1 − x ) 2 \begin{aligned}F(x)&=\sum_{n\ge 0}(n+1)x^n\\&=\sum_{n\ge 1}nx^{n-1}\\&=\sum_{n\ge 0}(x^n)'\\&=\left(\frac{1}{1-x}\right)'\\&=\frac{1}{(1-x)^2}\end{aligned} F(x)=n0(n+1)xn=n1nxn1=n0(xn)=(1x1)=(1x)21

牛顿二项式定理型

a n = ( m n ) a_n=\binom{m}{n} an=(nm) m m m 是常数, n ≥ 0 n\ge 0 n0)。

F ( x ) = ∑ n ≥ 0 ( m n ) x n = ( 1 + x ) m F(x)=\sum_{n\ge 0}\binom{m}{n}x^n=(1+x)^m F(x)=n0(nm)xn=(1+x)m

倒数型

a n = ( m + n n ) a_n=\binom{m+n}{n} an=(nm+n) m m m 是常数, n ≥ 0 n\ge 0 n0)。

F ( x ) = ∑ n ≥ 0 ( m + n n ) x n = 1 ( 1 − x ) m + 1 F(x)=\sum_{n\ge 0}\binom{m+n}{n}x^n=\frac{1}{(1-x)^{m+1}} F(x)=n0(nm+n)xn=(1x)m+11

积分型

不常用。

幂级数的展开

幂级数在封闭形式下运算之后,得到的函数应该再次展开成幂级数的形式,才能获取到新的数列信息。

常用的展开方法就是封闭的逆运算,以及适当的换元,求导,积分,泰勒级数等等。

应用

  1. 承德汉堡:偶数个
  2. 可乐:0 个或 1 个
  3. 鸡腿:0 个,1 个或 2 个
  4. 蜜桃多:奇数个
  5. 鸡块:4 的倍数个
  6. 包子:0 个,1 个,2 个或 3 个
  7. 土豆片炒肉:不超过一个。
  8. 面包:3 的倍数个

每种食物都是以“个”为单位,只要总数加起来是 n n n 就算一种方案。对于给出的 n n n 你需要计算出方案数,对 10007 10007 10007 取模。

这是一道经典的生成函数题。对于一种食物,我们可以设 a n a_n an 表示这种食物选 n n n 个的方案数,并求出它的生成函数。而两种食物一共选 n n n 个的方案数的生成函数,就是它们生成函数的卷积。多种食物选 n n n 个的方案数的生成函数也是它们生成函数的卷积。

在理解了方案数可以用卷积表示以后,我们就可以构造生成函数(标号对应题目中食物的标号):

  1. ∑ n ≥ 0 x 2 n = 1 1 − x 2 \displaystyle\sum_{n\ge 0}x^{2n}=\dfrac{1}{1-x^2} n0x2n=1x21
  2. 1 + x 1+x 1+x
  3. 1 + x + x 2 = 1 − x 3 1 − x 1+x+x^2=\dfrac{1-x^3}{1-x} 1+x+x2=1x1x3
  4. x 1 − x 2 \dfrac{x}{1-x^2} 1x2x
  5. ∑ n ≥ 0 x 4 n = 1 1 − x 4 \displaystyle \sum_{n\ge 0}x^{4n}=\dfrac{1}{1-x^4} n0x4n=1x41
  6. 1 + x + x 2 + x 3 = 1 − x 4 1 − x 1+x+x^2+x^3=\dfrac{1-x^4}{1-x} 1+x+x2+x3=1x1x4
  7. 1 + x 1+x 1+x
  8. 1 1 − x 3 \dfrac{1}{1-x^3} 1x31

那么全部乘起来,得到答案的生成函数:

F ( x ) = ( 1 + x ) ( 1 − x 3 ) x ( 1 − x 4 ) ( 1 + x ) ( 1 − x 2 ) ( 1 − x ) ( 1 − x 2 ) ( 1 − x 4 ) ( 1 − x ) ( 1 − x 3 ) = x ( 1 − x ) 4 F(x)=\frac{(1+x)(1-x^3)x(1-x^4)(1+x)}{(1-x^2)(1-x)(1-x^2)(1-x^4)(1-x)(1-x^3)} =\frac{x}{(1-x)^4} F(x)=(1x2)(1x)(1x2)(1x4)(1x)(1x3)(1+x)(1x3)x(1x4)(1+x)=(1x)4x

然后将它转化为展开形式:

F ( x ) = ∑ n ≥ 1 ( n + 2 n − 1 ) x n F(x)=\sum_{n\ge 1}\binom{n+2}{n-1}x^n F(x)=n1(n1n+2)xn

因此答案就是 ( n + 2 n − 1 ) = ( n + 2 3 ) \dbinom{n+2}{n-1}=\dbinom{n+2}{3} (n1n+2)=(3n+2)

例题

CF1548C

求解 ∑ i = 1 n ( 3 i x ) \sum_{i = 1}^n \binom{3i}{x} i=1n(x3i)

考虑构造一个系数是 ∑ i = 1 n ( 3 i t ) \sum_{i = 1}^n \binom{3i}{t} i=1n(t3i)关于 x t x^t xt的一个多项式生成函数。

固定 3 i 3i 3i那么 ( 3 i t ) = [ x t ] ( 1 + x ) 3 i \binom{3i}{t} = [x^t](1+x)^{3i} (t3i)=[xt](1+x)3i,那么所求多项式为 ∑ i = 1 n ( 3 i t ) = ∑ i = 1 n [ x t ] ( 1 + x ) 3 i = [ x t ] ∑ i = 1 n ( 1 + x ) 3 i \sum_{i = 1}^n \binom{3i}{t} = \sum_{i = 1}^n[x^t](1+x)^{3i} = [x^t]\sum_{i = 1}^n(1+x)^{3i} i=1n(t3i)=i=1n[xt](1+x)3i=[xt]i=1n(1+x)3i

考虑对 ∑ i = 1 n ( 1 + x ) 3 i \sum_{i = 1}^n(1+x)^{3i} i=1n(1+x)3i进行化简,套用等比数列求和公式得到:

( x + 1 ) 3 n + 3 − ( x + 1 ) 3 ( x + 1 ) 3 − 1 \frac {(x+1)^{3n+3}-(x+1)^3}{(x+1)^3-1} (x+1)31(x+1)3n+3(x+1)3

考虑多项式除法即可在 O ( n ) O(n) O(n)时间内算出所有的系数。

总结

生成函数是连接离散数学和连续数学的桥梁,离散数学的加法、乘法原理对应连续数学中的卷积运算,使得复杂的加法、乘法原理变成了相对简单的卷积运算,引入卷积之后,连续数学所有的求导、极限、积分理论均可使用。还有加快多项式卷积的FFT也可以使用。

  • 3
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值