一般生成函數(OGF)
引入
考慮一類組合對象組成的集合\(A\),其中:
- 每個元素\(a\in A\)都被定義了“大小”\(|a|\),它是一個非負整數。
- 對於給定的\(n\),大小為\(n\)的元素的數量是有限的,記作\(A_n\)
eg. \(A\)是全體\(01\)串組成的集合,一個\(01\)串的大小被定義為它的長度則\(A_n=2^n\)
定義
\(A\left( x\right) =\sum ^{\infty }_{i=0}A_ix^{i}\)
為\(A\)的一般生成函數
注意
- \(A(x)\)為一個多項式
- 這里的\(A_i\)為第\(i\)項的 系數
這是一個形式冪級數,不用考慮何時收斂
這里的\(x^i\)為形式冪,無實義,一般也不會去求
但是\(x^i\)有區分實際意義的作用,即\(x^i\rightarrow\)第\(i\)項
\(x^i\)的系數為第\(i\)種狀態的答案
這個不好說,舉個例子
eg.
\(A\)是全體\(01\)串組成的集合,則
\(\begin{aligned}A\left( x\right) =\sum ^{\infty }_{i=0}2^{i}x^{i}\end{aligned}=\dfrac{1}{1-2x}\)
最后一步是用的等比數列求和公式,不用考慮何時收斂,所以認為其很大是趨近於0
其中\(A_i=2^i\),表示長度為\(i\)的答案為\(2^i\)
\(x^i\)的系數就是長度為\(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\)是全體字母組成的集合
\(\begin{aligned}A\left( x\right) =\sum ^{\infty }_{i=0}2^{i}x^{i}\end{aligned}=\dfrac{1}{1-2x}\)
\(\begin{aligned}B\left( x\right) =\sum ^{\infty }_{i=0}26^{i}x^{i}\end{aligned}=\dfrac{1}{1-26x}\)
\(C(x)=A(x)+B(x)\),\(C(x)\)表示全體\(01\)串與全體字母的並集
\(C(x)\)中\(x^i\)項的系數表示長度為\(i\)的\(01\)串與字符串有多少
\(D(x)=A(x)B(x)\),\(D(x)\)表示\(01\)串與字符串拼接出的串(前面是\(01\)串,后面是字符串)
\(D(x)\)中\(x^i\)項的系數表示長度為\(i\)的拼接出的串有多少
其中某串長度可以為0
個人理解
我們發現上面的例題中的\(D\)如果我們不考慮多項式
自己暴力的去算,也有這樣的公式
\(\begin{aligned}\sum_{i+j=n}a_ib_j\end{aligned}\)
其中\(a_i\)表示長度為\(i\)的\(01\)串有多少種,\(b_j\)表示長度為\(j\)的字符串有多少種
然后我們可以發現長度\(i+j\)的答案會由\(i\)與\(j\)項得到,再發現其與指數乘法有相似之處,即\(x^ix^j=x^{i+j}\),之后就想到將答案存為其系數,\(x^i\)表示實際意義,於是就可以用多項式來解決問題,因為多項式可以\(FFT\)優化,比暴力快很多
(我覺得生成函數可能就是這么來的.....)
指數生成函數(EGF)
引入
有時我們需要考慮帶標號的組合對象,比如圖
\(n\)個點的標號圖,頂點的標號恰好為\(1\sim n\)
帶標號對象的拼接
將兩個對象\(a;b\)拼接起來,\(|a|=n,|b|=m\)
- 無標號時,只有一種方法
- 帶標號時,規定拼接時拼接對象內部相對標號順序不變,而互相的標號
可以改變,則有\(C_{n+m}^{n}(\begin{pmatrix} n+m \\ n \end{pmatrix})\)種拼接方法
因為只要考慮前\(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\),定義
\(\begin{aligned}A\left( x\right) =\sum _{i= 0}^nA_{i}\dfrac {x^{i}}{i!}\end{aligned}\)
為\(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)\)
\(\begin{aligned}D(x)=\sum _{i+j=n}A_{i}B_{j}\dfrac {\left( i+j\right) !}{i!j!}\end{aligned}\)
\(\begin{aligned}\dfrac {D(x)}{n!}=\sum _{i+j=n}\dfrac {Ai}{i!}\dfrac {B_{j}}{j!}\end{aligned}\)
所以乘法運算成立
個人理解
如引入中的問題
用一般生成函數來求解
\(\begin{aligned}D\left( x\right) =A\left( x\right) B\left( x\right) =\sum ^{n}_{i+j=n}A_{i}\cdot B_{j}\begin{pmatrix} n \\ i \end{pmatrix}\end{aligned}\)
最后又化簡成
\(\begin{aligned}\dfrac {D(x)}{n!}=\sum _{i+j=n}\dfrac {Ai}{i!}\dfrac {B_{j}}{j!}\end{aligned}\)
於是我們就弄出一個指數生成函數方便運算且省去求組合數
以下\(A\)為生成函數
生成序列(seq)
如字面意思,要生成一個序列
序列的順序是確定的
\(\begin{aligned}seq\left( A\right) =\sum ^{\infty }_{i=0}Ai=\dfrac {1}{1-A}\end{aligned}\)
生成集合(set)
如字面意思,要生成一個集合
集合的順序是無關緊要的,所以要除以全排列
\(\begin{aligned}set\left( A\right) =\sum ^{\infty }_{i=0}\dfrac{A^i}{i!}=e^A\end{aligned}\)
最后一步是因為該式子符合\(e^x\)的泰勒展開
關於泰勒展開可看我的該篇博客泰勒公式於牛頓迭代
如有哪里講得不是很明白或是有錯誤,歡迎指正
如您喜歡的話不妨點個贊收藏一下吧