也許更好的閱讀體驗
一般生成函數(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的泰勒展開
關於泰勒展開可看我的該篇博客泰勒公式於牛頓迭代
如有哪裏講得不是很明白或是有錯誤,歡迎指正
如您喜歡的話不妨點個贊收藏一下吧