OGF 学习笔记
生成函数(generating function,简称 GF),一般只应用两种:OGF 和 EGF。
OGF 和 EGF 都是定义在一个数列上的。
【一些前置知识】
二项式卷积:
复合函数求导:
指数函数的导:
幂函数的导:
对数函数的导:
【OGF】
【定义】
对于一个有限序列
对于一个无限序列
注意生成函数是一种形式幂级数,也就是一般情况下我们不考虑
(我们把
注:有时也把 OGF 称作母函数。
砝码称重
有
令
怎么理解呢?
取球方案
有
-
每种颜色的球各一个。显然答案是
。 -
每种颜色的球无限个。即求方程
非负整数解个数,隔板法 。
怎么用生成函数做?
当每种球只有一个,令
当每种球有无限个,令
这里用到广义二项式定理。
可得
把前面的
装水果
类似这题
要求苹果个数为偶数,香蕉个数为
考虑生成函数
而
观察可得
【运算规则】
记数列
-
扩倍规则:若
每一项乘以 ,则 。 -
加法规则:若有另一个数列
的生成函数是 ,则 的生成函数是 。 -
右移规则:若让
开头加上 个 ,则 。 -
求导规则:
,则 ,这里就是从 开始,不是打错了。
练习:求
解:
注意这里的求导:
又有
注意这里的求导:
- 乘法法则:若有两个数列
和生成函数 ,则生成函数为 的数列为 的卷积。(EGF 对应的是二项式卷积)
【OGF 求递推公式】
汉诺塔问题
用归纳法很容易,但是怎么用生成函数做?
考虑
每个等号左右两边各自加起来,有
所以
观察可以发现
斐波那契数列
矩阵快速幂当然可以。但是我们这里还是考虑生成函数
同样把每个等号左右两边加起来,
这里可以因式分解,
可得
所以
卡特兰数
(众所周知,
同样等号两边相加,
为什么不取加号?因为
于是
观察得
对于一个
只要是这种形式,生成函数
【OGF 的具体应用和 tricks】
例1:整数的 lqp 拆分
题意:定义
的一个 lqp 拆分是把 拆成若干个有序的正整数之和。同时记 为斐波那契数列。
定义一个 lqp 拆分的权值为:它拆出来的所有数为,权值为 ,求 的所有 lqp 拆分的权值和。 。
令
为了方便,令
如此,
还是考虑生成函数
但是直接加没有结果,把
所以
则
怎么求
右边系数为
从母函数推原递推式:比较系数法。
例2
随机生成
个结点的有根二叉树。问叶子个数的期望值。
令
为什么?考虑一颗二叉树的叶子个数,我们可以先计算左边的点数以及左边子树的叶子数量:
右子树也是对称的,所以要乘
那接下来怎么办呢?考虑
还是等号左右相加。
则
广义二项式定理展开,
则
则
拆分方案
题意:把
拆成若干 的和,不考虑顺序,求方案数。
设
设
观察
对于
这里采用倒数的方法,原因是倒数的形式简单,而且线性齐次递推式的项数比较少。
CF506E子问题
题意:
个字符串 ,由字符 a
到x
组成。
个字符串 ,由字符 a
到y
组成。
个字符串 ,由 a
到z
组成。
已知总长度和为,允许空串。求方案数。 。
令
而
UOJ424
题意:左拐度
的 个结点二叉树计数。定义左拐度为所有根到叶子的路径中,向左走的次数的最大值。 。
设
观察
令
类似地,可以推出
如果暴力从
显然
则
我们想用矩阵快速幂:因为这是一个线性齐次递推式。但是如果矩阵的元素是多项式,很麻烦;可以使用拉格朗日插值公式,随便选
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
· 没有源码,如何修改代码逻辑?
· PowerShell开发游戏 · 打蜜蜂
· 在鹅厂做java开发是什么体验
· WPF到Web的无缝过渡:英雄联盟客户端的OpenSilver迁移实战