也许更好的阅读体验
一般生成函数(OGF)
引入
考虑一类组合对象组成的集合 A,其中:
- 每个元素 a∈A都被定义了“大小” ∣a∣,它是一个非负整数。
- 对于给定的 n,大小为 n的元素的数量是有限的,记作 An
eg. A是全体 01串组成的集合,一个 01串的大小被定义为它的长度则 An=2n
定义
A(x)=∑i=0∞Aixi
为 A的一般生成函数
注意
- A(x)为一个多项式
- 这里的 Ai为第 i项的 系数
这是一个形式幂级数,不用考虑何时收敛
这里的 xi为形式幂,无实义,一般也不会去求
但是 xi有区分实际意义的作用,即 xi→第 i项
xi的系数为第 i种状态的答案
这个不好说,举个例子
eg.
A是全体 01串组成的集合,则
A(x)=i=0∑∞2ixi=1−2x1
最后一步是用的等比数列求和公式,不用考虑何时收敛,所以认为其很大是趋近于0
其中 Ai=2i,表示长度为 i的答案为 2i
xi的系数就是长度为 i的答案,它是用于区分这个的
运算
有两类组合对象 A和 B
- 定义 C为 A和 B的并集
C(x)=A(x)+B(x),O(n)计算 - 定义 D为 A和 B的笛卡尔积,也即 D中每个元素 d都是 A中某元素 a与 B中某元素 b拼成的二元组 (a,b),其大小 ∣d∣ 定义为 ∣a∣+∣b∣
D(x)=A(x)B(x), FFT乘法 O(nlogn)计算
eg:
A是全体 01串组成的集合, B是全体字母组成的集合
A(x)=i=0∑∞2ixi=1−2x1
B(x)=i=0∑∞26ixi=1−26x1
C(x)=A(x)+B(x), C(x)表示全体 01串与全体字母的并集
C(x)中 xi项的系数表示长度为 i的 01串与字符串有多少
D(x)=A(x)B(x), D(x)表示 01串与字符串拼接出的串(前面是 01串,后面是字符串)
D(x)中 xi项的系数表示长度为 i的拼接出的串有多少
其中某串长度可以为0
个人理解
我们发现上面的例题中的 D如果我们不考虑多项式
自己暴力的去算,也有这样的公式
i+j=n∑aibj
其中 ai表示长度为 i的 01串有多少种, bj表示长度为 j的字符串有多少种
然后我们可以发现长度 i+j的答案会由 i与 j项得到,再发现其与指数乘法有相似之处,即 xixj=xi+j,之后就想到将答案存为其系数, xi表示实际意义,于是就可以用多项式来解决问题,因为多项式可以 FFT优化,比暴力快很多
(我觉得生成函数可能就是这么来的…)
指数生成函数(EGF)
引入
有时我们需要考虑带标号的组合对象,比如图
n个点的标号图,顶点的标号恰好为 1∼n
带标号对象的拼接
将两个对象 a;b拼接起来, ∣a∣=n,∣b∣=m
- 无标号时,只有一种方法
- 带标号时,规定拼接时拼接对象内部相对标号顺序不变,而互相的标号
可以改变,则有 Cn+mn((n+mn))种拼接方法
因为只要考虑前 a中的 n个用了哪些标号,剩下的 m个给 b中的 m个,答案唯一,而对象内部相对标号顺序不变,所以得到的标号如何分配也是唯一的
eg.
将 213,21(每个数字是一个标号)拼接,有 10种方法
数字表示分配的标号
435,21∣ 425,31∣ 325,41∣ 324,51∣ 415,32
315,42∣ 314,52∣ 215,43∣ 214,53∣ 213,54
如第一种方案 435对应的 231相对标号顺序不变, 31对应的 21相对标号顺序也不变
定义
对于带标号组合对象组成的集合 A,定义
A(x)=i=0∑nAii!xi
为 A的指数生成函数
运算
有两类组合对象 A和 B
- 定义 C为 A和 B的并集
C(x)=A(x)+B(x),O(n)计算 - 定义 D为 A和 B的笛卡尔积,也即 D中每个元素 d都是 A中某元素 a与 B中某元素 b拼成的二元组 (a,b),其大小 ∣d∣ 定义为 ∣a∣+∣b∣
D(x)=A(x)B(x), FFT乘法 O(nlogn)计算
没错,就是复制上面的内容
对于 D(x)
D(x)=i+j=n∑AiBji!j!(i+j)!
n!D(x)=i+j=n∑i!Aij!Bj
所以乘法运算成立
个人理解
如引入中的问题
用一般生成函数来求解
D(x)=A(x)B(x)=i+j=n∑nAi⋅Bj(ni)
最后又化简成
n!D(x)=i+j=n∑i!Aij!Bj
于是我们就弄出一个指数生成函数方便运算且省去求组合数
以下 A为生成函数
生成序列(seq)
如字面意思,要生成一个序列
序列的顺序是确定的
seq(A)=i=0∑∞Ai=1−A1
生成集合(set)
如字面意思,要生成一个集合
集合的顺序是无关紧要的,所以要除以全排列
set(A)=i=0∑∞i!Ai=eA
最后一步是因为该式子符合 ex的泰勒展开
关于泰勒展开可看我的该篇博客泰勒公式于牛顿迭代
如有哪里讲得不是很明白或是有错误,欢迎指正
如您喜欢的话不妨点个赞收藏一下吧