生成函数入门及应用 生成函数

说实话这东西至少得学一天……

普通型生成函数 OGF

数列 f ( x ) = a x 的普通型生成函数为 g ( x ) = i = 0 a i x i
一般来说, f ( x ) 是有特殊性质的。它会得到一些特殊的生成函数。在收敛意义下(假设函数会收敛),生成函数有以下计算公式:
i = 0 x i = 1 1 x ,即 f ( x ) = 1 的生成函数为 g ( x ) = 1 1 x
i = 0 n C n i x i = ( 1 + x ) n ,即 f ( x ) = C n x 的生成函数。这其实是二项式定理。
i = 0 C n + i 1 i x i = 1 ( 1 x ) n ,即 f ( x ) = C n + x 1 x 的生成函数。(广义二项式定理)
i = 0 ( i + 1 ) x i = 1 ( 1 x ) 2 ,即 f ( x ) = x + 1 的生成函数。这是上式的特殊情况。
在第一个式子中,将 x 代为其它式子,有:
i = 0 x k i = 1 1 x k ,即 f ( x ) = x % k ? 0 : 1 的生成函数。
i = m x i = x m 1 x ,即 f ( x ) = [ x m ] 的生成函数。
i = 0 a i x i = 1 1 a x ,即 f ( x ) = a x 的生成函数。
还有一些显然的式子,如:
i = 0 n x i = 1 x n + 1 1 x ,即 f ( x ) = 1 ( x n ) 的生成函数。
将以上形式进行组合,还可以得到多种生成函数。得到生成函数后,从右反推到左得到原函数。
生成函数的意义在于将复杂的组合问题转化为简单的计算问题。普通型生成函数做组合问题,而指数型生成函数做排列问题。

练习题:求选n个水果的方案数。苹果和香蕉有无限个,但苹果必须成对拿,而香蕉必须五个一组地拿;橘子只有4个,梨只有一个。

f ( n ) 表示选 n 个水果的方案数。将每种水果的生成函数乘起来,有

g ( x ) = i = 0 x 2 i i = 0 x 5 i i = 0 4 x i i = 0 1 x i

= 1 1 x 2 1 1 x 5 1 x 5 1 x ( 1 + x )

= 1 ( 1 x ) 2

由开篇第四个式子,得 f ( x ) = x + 1

求斐波那契数列通项

斐波那契数列的生成函数为 g ( x ) = x + x 2 + 2 x 3 + 3 x 4 + 5 x 5 + 8 x 6 + . . .
由数列性质容易推知

x 2 g ( x ) + x g ( x ) + x = g ( x )

整理得
g ( x ) = x 1 x x 2

我们需要将生成函数还原。设
g ( x ) = a 1 c x + b 1 d x

化简解得参数,于是得到递推式。具体请读者计算。

指数型生成函数 EGF

函数 f ( x ) = a x 的指数型生成函数为 h ( x ) = i = 0 a i x i i !
新的公式是 i = 0 x i i ! = e x 。同样可以通过代换 x 得到很多公式变形。以下为典型变形:
i = 0 x 2 i ( 2 i ) ! = e x + e x 2
i = 0 x 2 i + 1 ( 2 i + 1 ) ! = e x e x 2
数列{0,1,0,-1,0,1,0,-1….}的指数型生成函数为sin(x),数列{1,0,-1,0,1,0,-1,0….}的指数型生成函数为cos(x)。

练习题:求选n个水果的方案数。苹果、香蕉、橙子、梨都有无限个,但苹果要选奇数个,香蕉要选偶数个。每个水果都不同

因为是排列问题,所以用指数型生成函数。

h ( x ) = e x e x 2 e x + e x 2 ( e x ) 2

= e 4 x 1 4

= i = 1 4 i x i i ! 4

= i = 1 4 i 1 x i i !

于是 f ( x ) = 4 x 1

猜你喜欢

转载自blog.csdn.net/myjs999/article/details/81042100