普通生成函数
序列
- 序列
的普通生成函数是 。 - 序列
的普通生成函数是 。 - 序列
的生成函数是 。 - 序列
的生成函数是 。
换句话说,如果序列
基本运算
考虑两个序列
因此
考虑乘法运算,也就是卷积:
因此
封闭形式
在运用生成函数的过程中,我们不会一直使用形式幂级数的形式,而会适时地转化为封闭形式以更好地化简。
例如
那么解这个方程得到
这就是
考虑等比数列
等比数列的封闭形式与展开形式是常用的变换手段。
小练习
请求出下列数列的普通生成函数(形式幂级数形式和封闭形式)。难度是循序渐进的。
。 。 。 ( 是常数, )。 ( 是常数, )。
答案
第一个:
第二个:
第三个(求导):
第四个(二项式定理):
第五个:
可以使用归纳法证明。
首先当
而当
斐波那契数列的生成函数
接下来我们来推导斐波那契数列的生成函数。
斐波那契数列定义为
那么解得
那么接下来的问题是,如何求出它的展开形式?
展开方式一
不妨将
我们得到了
展开方式二
考虑求解一个待定系数的方程:
通分得到
待定项系数相等,我们得到
解得
那么我们根据等比数列的展开式,就可以得到斐波那契数列的通项公式:
这也被称为斐波那契数列的另一个封闭形式(
对于任意多项式
当对分母进行因式分解但有重根时,每有一个重根就要多一个分式,如考虑生成函数
的系数的通项公式,那么有
解得
那么
牛顿二项式定理
我们重新定义组合数的运算:
注意
二项式定理其实是牛顿二项式定理的一个特殊情况。
卡特兰数的生成函数
应用
接下来给出一些例题,来介绍生成函数在 OI 中的具体应用。
食物
食物
在许多不同种类的食物中选出
- 承德汉堡:偶数个
- 可乐:0 个或 1 个
- 鸡腿:0 个,1 个或 2 个
- 蜜桃多:奇数个
- 鸡块:4 的倍数个
- 包子:0 个,1 个,2 个或 3 个
- 土豆片炒肉:不超过一个。
- 面包:3 的倍数个
每种食物都是以「个」为单位,只要总数加起来是
这是一道经典的生成函数题。对于一种食物,我们可以设
在理解了方案数可以用卷积表示以后,我们就可以构造生成函数(标号对应题目中食物的标号):
。 。 。 。 。 。 。 。
那么全部乘起来,得到答案的生成函数:
然后将它转化为展开形式(使用封闭形式练习中第五个练习):
因此答案就是
Sweet
「CEOI2004」Sweet
有
两种方案不同当且仅当吃的个数不同,或者吃的糖果中,某一种糖果的个数在两个方案中不同。
在第
因此总共吃
现在我们要求的是
由于
然后对
我们枚举
这样就可以
时间复杂度
本页面最近更新:2023/3/22 15:46:23,更新历史
发现错误?想一起完善? 在 GitHub 上编辑此页!
本页面贡献者:sshwy, CCXXXI, countercurrent-time, Enter-tainer, Great-designer, hly1204, NachtgeistW, purple-vine, schtonn, shuzhouliu, skylee03, SukkaW
本页面的全部内容在 CC BY-SA 4.0 和 SATA 协议之条款下提供,附加条款亦可能应用