生成函式入門
普通型生成函式
定義
將序列\(A\)表示為形式冪級數\(A(x)=\sum\limits_{i=0}^na_ix^i\) ,則稱形式冪級數\(A(x)\)為序列\(A\) 的普通型生成函式,形式冪級數的第\(i\) 項係數就是序列A的第\(i\)項。
初學會有一個疑問,什麼是形式冪級數?顧名思義,這個冪級數中的\(x\)只是一個形式而已,\(x\)可以取任意值而不影響我們需要得到的係數的值(因為我們用生成函式需要的只是係數\(a\),而和\(x\)無關)所以為了化簡形式冪級數的表達,我們常常定義\(|x|<1\),這樣我們的和式就是收斂的。
比如序列\(<1,1,1,1,1,...>\) 的普通型生成函式就是\(\sum\limits_{i=0}^{\infty}x^i=1+x+x^2+x^3+x^4+...\) ,如果\(|x|<1\) ,那麼我們會得到和式的值\(\sum\limits_{i=0}^{\infty}x^i=\frac{1}{1-x}\),可以用右邊的值來簡單的表達一個序列的生成函式。
應用
使用普通型生成函式主要是為了解決通過兩個序列得到一個新序列的問題。
經典的例子:
有n種不同的球,現在任意選擇k個球,問有多少個方案?
初看這個問題,接觸過的人容易聯想到將問題轉換為不定方程的形式,即問:
\(x_1+x_2+...+x_n=k,0\le x\) 的解的個數
考慮將\(x\) 對映到\(y=x+1\) 上,把方程轉換為\(y_1+y_2+y_3+...+y_n=k+n,1\le y\) ,然後就是一個\(k+n\)個小球插\(n-1\) 個板子有多少種插法的問題了,答案就是 \(\binom{k+n-1}{n-1}\) 。
而這個問題也可以通過生成函式來求解。每一種球的生成函式是\(\sum\limits_{i=0}^{\infty}x^i=\frac{1}{1-x}\),我們考慮只有兩種球,從中挑出3個球的方案。
它的挑選方式是(0,3) ,(1,2),(2,1),(3,0)共四種,假設兩個球的生成函式序列是A(x),B(x),那麼我們認為這裡邊的第一種方案是A(x)的第0項和B(x)的第4項組合來的,同理,第二種方案是A(x)的第1項和B(x)的第3項組合來的,形式化的,如果我們設最終選k個球的方案序列是C,那麼C的生成函式是\(\sum\limits_{i=0}c_ix^i\),而我們剛剛的例子可以表示為\(c_3=\sum\limits_{i=0}^{3}a_ib_{3-i}\) ,(A ,B都是全1序列),也就是說我們C的生成函式應該是我們A的生成函式和B的生成函式的卷積,即A(x)B(x)=C(x),表示式即:
\(C(x)=\sum\limits_{i=0}^{\infty}x^i\sum\limits_{j=0}^{i}a_jb_{i-j}\) , 每一項係數\(c_i\)都是兩個生成函式在\(i\)的卷積。
那如果是3種球呢?就得三個一起卷? 4種呢?太麻煩了吧。
對於這道題來說似乎確實是這樣,單純考慮生成函式是困難的,或者說複雜度是較高的,但是,這道題指明瞭普通型生成函式的一個應用,那就是對於知n求一的這種問題,可以考慮把序列生成函式卷積,然後就可以在第n次項的係數找到問題的解。
且這個例子指明瞭一個事實:考慮把A(x)表示為\(\frac{1}{1-x}\),B(x)同理,那它們的卷積是\(\frac{1}{(1-x)^2}\),即\(C_2(x)=\frac{1}{(1-x)^2}\),而我們也知道\(C_n(x)=\sum\limits_{i=0}^{\infty}\binom{n+i-1}{i-1}x^i\),(C的下標表示我們球的種類數量),所以我們可以發現\(\frac{1}{(1-x)^n}=\sum\limits_{i=0}^{\infty}\binom{n+i-1}{i-1}x^i\),即\(n\)種球,選任意個球的方案的序列的生成函式和它的和我們能夠將其對應起來了,方便我們對生成函式的應用。
以上,我們介紹了普通型生成函式如何處理簡單的組合問題。
指數型生成函式
定義
同樣定義序列A的生成函式,但是這次我們換了個方式,我們定義A的生成函式為\(A(x)=\sum\limits_{i=0}^{\infty}a_i\frac{x^i}{i!}\),並稱這樣定義的生成函式為指數型生成函式。
應用
指數型生成函式用來解決排列問題。
問,從n種球中依次拿出\(k_1,k_2,k_3...k_n\)共N個球形成排列,有多少種方案?
(即可以認為一種球代表一個數字,這樣有序的取N個數字有多少給排列,這種問題也叫多重集的排列問題)
這個問題從排列組合的角度也比較好解決,考慮總序列的排列方式\(N!\),然後除去所有的相同數字的內部排列
最終的方案就是 \(\frac{N!}{k_1!k_2!k_3!...k_n!}\),如果只是問從n組數中得到N個球的排列方案,就要把下邊的k進行組合,然後把所有的方案加起來,也就是
\(\sum\limits_{k_1=0}^{N}\sum\limits_{k_2=0}^{N-k_1}\sum\limits_{k_3=0}^{N-k_1-k_2}...\sum\limits_{k_{n-1}=0}^{N-\sum_1^{n-2}k_i}\frac{N!}{k_1!k_2!...(N-\sum_1^{n-1}k_i)!} \ \ \ (1)\) 這樣的一個式子。
我們嘗試用生成函式來解決這個問題,設每一個數字的生成函式都為\(\sum\limits_{i=0}^{\infty}\frac{x^i}{i!}\)。
測試一組小資料 n=3,N=3,我們看看\(A_1(x)* A_2(x) *A_3(x)\),在第3項的係數。
第3項的係數為\(\frac{9}{2}\)我們把它乘上一個\(3!\),那麼我們就會得到值\(27\),即在3種數裡選擇3個的排列方案了。
不信?我們暴力算一遍,選擇為\((3,0,0)\) (即第一種選3個,第二種選0個,第三種選0個,後同),排列為1
\((0,3,0)=1,(0,0,3)=1,(2,1,0)=3,(2,0,1)=3,(1,2,0)=3,(1,1,1)=6,(1,0,2)=3,(0,2,1)=3,(0,1,2)=3\)
他們的和\(1+1+1+3+3+3+6+3+3+3=27\) ,正是27!(是27不是27!)
我們考慮為什麼我們的生成函式卷積得到的係數乘上一個\(N!\)就是我們想要的選N個數的答案,觀察我們的(1)式,它需要的就是所有情況的組合階乘作為每個情況的分母,而我們的生成函式卷積,\(x\)的指數就意味著選擇的數的數量,我們知道,為了產生第n項的係數(x的指數為n),我們會進行所有可能的組合相乘,卷積後的係數正是所有的選擇產生的和,分母剛好就是我們(1)式中\((k_1!k_2!...k_n!)\),所以我們距離正確答案就差乘上一個分子N!,因此我們得到的卷積後得到的係數只要乘N!,就是我們想要的答案。
同樣,我們如果把指數型生成函式的\(x\)劃定在\(|x|<1\)的範圍內,也會得到一個漂亮的收斂值\(e^x=\sum\limits_{i=0}^{\infty}\frac{x^i}{i!}\)(泰勒展開),它也可以方便我們的應用。
上邊說過的兩個式子\(\frac{1}{(1-x)^n}=\sum\limits_{i=0}^{\infty}\binom{n+i-1}{i-1}x^i\) ,\(e^x=\sum\limits_{i=0}^{\infty}\frac{x^i}{i!}\)確實非常有用,但這裡只是入門的理解,所以就不在這個部落格裡展開了(其實我現在也不大會用,但能用的地方確實多!!),下邊會做題用的。
寫這個部落格主要為了自己複習以及加深對生成函式的理解,如有不當,請不吝賜教。
參考資料
《小學生都能看懂的生成函式從入門到昇天教程》《生成函式全家桶》
[演算法|小學生都能看懂的生成函式入門教程 - 知乎 (zhihu.com)]