8.13.13 ACM-ICPC 多项式与生成函数:普通生成函数
普通生成函数简介
普通生成函数(Ordinary Generating Function,OGF)是组合数学和计算机科学中的一个强大工具,尤其在像ACM-ICPC这样的竞赛编程背景下。序列 aaa 的普通生成函数定义为形式幂级数:
F(x)=∑nanxnF(x) = \sum_{n} a_n x^nF(x)=∑nanxn
其中,aaa 可以是有限序列,也可以是无限序列。常见的例子(假设 aaa 以0为起点):
换句话说,如果序列 aaa 有通项公式,那么它的普通生成函数的系数就是通项公式。
普通生成函数的基本运算
加法与减法
考虑两个序列 aaa 和 bbb 的普通生成函数分别为 F(x)F(x)F(x) 和 G(x)G(x)G(x)。那么有:
因此,F(x)±G(x)F(x) \pm G(x)F(x)±G(x) 是序列 〈an±bn〉\langle a_n \pm b_n \rangle〈an±bn〉 的普通生成函数。
乘法(卷积)
对于乘法运算,也就是卷积,有:
因此,F(x)G(x)F(x)G(x)F(x)G(x) 是序列 〈∑i=0naibn−i〉\langle \sum_{i=0}^n a_i b_{n-i} \rangle〈∑i=0naibn−i〉 的普通生成函数。
封闭形式
在使用生成函数的过程中,我们不会一直使用形式幂级数的形式,而是适时地转化为封闭形式以更好地简化问题。例如,序列 〈1,1,1,⋯ 〉\langle 1, 1, 1, \cdots \rangle〈1,1,1,⋯〉 的普通生成函数 F(x)=∑n≥0xnF(x) = \sum_{n \ge 0} x^nF(x)=∑n≥0xn,我们可以发现:
解这个方程得到:
F(x)=11−xF(x) = \frac{1}{1-x}F(x)=1−x1
这就是 ∑n≥0xn\sum_{n \ge 0} x^n∑n≥0xn 的封闭形式。
小练习
为了更好地理解普通生成函数,以下是一些序列的普通生成函数(包括形式幂级数和封闭形式)的练习:
斐波那契数列的生成函数推导
斐波那契数列定义为 设它的普通生成函数为 F(x)F(x)F(x),根据递推式,我们可以列出关于 F(x)F(x)F(x) 的方程:
解得:
为了找到它的展开形式,我们可以使用两种方法:
方法一
将 x+x2x + x^2x+x2 看作一个整体:
方法二
使用待定系数法求解:
通过系数对比,我们可以解得 AAA、BBB、aaa 和 bbb 的值:
因此,斐波那契数列的闭合形式为:
生成函数在问题解决中的应用
生成函数在解决特定条件下选择项目的数量问题中非常关键。举例来说,考虑从各种食物中选择 nnn 个,每种食物有不同的限制。使用生成函数,我们可以为每种食物构造生成函数,并将它们结合起来找出总的选择方案数。
例如,对于一个食物项的选择限制(如选择偶数个或特定倍数),我们可以导出生成函数并使用卷积来结合这些生成函数。这种方法为解决复杂的组合问题提供了一种高效的方法。
结论
理解和使用普通生成函数可以大大简化序列相关问题的解决,特别是在竞赛编程和组合数学中。通过掌握基本运算和转换,我们可以利用普通生成函数推导闭合形式,解决递推关系,并将其应用于实际问题中,从而提高解决问题的效率。