8.13.14 ACM-ICPC 多项式与生成函数 指数生成函数

8.13.13 ACM-ICPC 多项式与生成函数:普通生成函数

普通生成函数简介

普通生成函数(Ordinary Generating Function,OGF)是组合数学和计算机科学中的一个强大工具,尤其在像ACM-ICPC这样的竞赛编程背景下。序列 aaa 的普通生成函数定义为形式幂级数:

F(x)=∑nanxnF(x) = \sum_{n} a_n x^nF(x)=∑n​an​xn

其中,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=0n​ai​bn−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≥0​xn,我们可以发现:

解这个方程得到:

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

这就是 ∑n≥0xn\sum_{n \ge 0} x^n∑n≥0​xn 的封闭形式。

小练习

为了更好地理解普通生成函数,以下是一些序列的普通生成函数(包括形式幂级数和封闭形式)的练习:

斐波那契数列的生成函数推导

斐波那契数列定义为 设它的普通生成函数为 F(x)F(x)F(x),根据递推式,我们可以列出关于 F(x)F(x)F(x) 的方程:

解得:

为了找到它的展开形式,我们可以使用两种方法:

方法一

将 x+x2x + x^2x+x2 看作一个整体:

方法二

使用待定系数法求解:

通过系数对比,我们可以解得 AAA、BBB、aaa 和 bbb 的值:

因此,斐波那契数列的闭合形式为:

生成函数在问题解决中的应用

生成函数在解决特定条件下选择项目的数量问题中非常关键。举例来说,考虑从各种食物中选择 nnn 个,每种食物有不同的限制。使用生成函数,我们可以为每种食物构造生成函数,并将它们结合起来找出总的选择方案数。

例如,对于一个食物项的选择限制(如选择偶数个或特定倍数),我们可以导出生成函数并使用卷积来结合这些生成函数。这种方法为解决复杂的组合问题提供了一种高效的方法。

结论

理解和使用普通生成函数可以大大简化序列相关问题的解决,特别是在竞赛编程和组合数学中。通过掌握基本运算和转换,我们可以利用普通生成函数推导闭合形式,解决递推关系,并将其应用于实际问题中,从而提高解决问题的效率。

  • 15
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

夏驰和徐策

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值