給定一個有窮或者讓無窮數列{\(a_0,a_1,...\)},則稱\(g(x)=a_0+a_1x+a_2x^2+...(-1<x<1)\)為原數列的一個生成函式
本質就是將問題轉換為多項式問題,從而利用多項式的性質去解決問題
一些生成函式的化簡見OI-wiki封閉形式
例題:現有\(1g,2,g,3g\)的砝碼各一個,問能稱出多重的物品,以及每個重量的物品被稱出的方法數
我們先用DP的角度看待這個問題,設\(f[i][j]\)表示用前\(i\)個砝碼可以稱出重量為\(j\)的物品的方案數,則\(f[i][j]=f[i-1][j-weight[i]]+f[i-1][j]\)
然後我們再用多項式的角度去看待這個問題,設系\(a_i\)表示稱出重量為\(i\)的物品的方案數,此時我們像DP一樣,一個階段一個階段地考慮問題。對於第一個砝碼,有\(f_1(x)=1+x\)(常數項的係數\(a_0\)為\(1\),表示用第一個砝碼稱出重量為\(0\)的物品的方案數是\(1\);\(x\)的係數\(a_1\)為\(1\),表示用第一個砝碼稱出重量為\(1\)的物品的方案數是\(1\));對於前兩個砝碼有\(f_2(x)=f_1(x)(1+x^2)=1+x+x^2+x^3\)(\((1+x^2)\)與上面的解釋一樣,這裡之所以要兩者乘起來就是利用了多項式相乘指數相加的原理,即\(f_1(x)\)中的\(a_ix^i\)的\(a_i\)已經儲存了用前一個砝碼稱出重量為\(i\)的物品的方案數,我們現在又知道了用第二個砝碼稱出重量為\(j\)的方案數\(a_j\),那麼這一個組合對“用前兩個砝碼稱出重量為\(i+j\)的物品的方案數”的貢獻就是\(a_ia_j\),此時係數剛好相乘即乘法原理而\(x\)的指數相加剛好表示稱出\(i+j\)的物品的方案數);對於前三個砝碼有\(f_3(x)=f_2(x)(1+x^3)=1+x+x^2+2x^3+x^4+x^5+x^6\)。最終得到的這個式子的係數就分別說明了方案數;或者也可以用整體來考慮,直接寫出\(f(x)=(1+x)(1+x^2)(1+x^3)\),\(f(x)\)的展開式是從三個因子中各選一項來組成的,而三個因子各選一項也就代表了三個砝碼的不同選擇,相乘時用了乘法原理,合併同類項時用了加法原理
又比如三個砝碼的數量分別是\(2,+\infty,1\),那麼生成函式就是\(f(x)=(1+x+x^2)(1+x^2+x^4+x^6+...)(1+x^3)\)
另一道例題:現有\(n\)個不同的蘋果,每種蘋果都有無窮多個,選出\(k\)個蘋果,請求出方案數,要求用生成函式解決這個問題
不難知道\(f_i(x)=(1+x+x^2+...)=\frac{1}{1-x}\),於是\(f(x)=\overset{n}{\underset{i=1}{\prod}}f_i(x)\)
用組合數學的角度看問題,即\(x_1+x_2+...+x_n=n+k(x_i≥1)\),隔板法求得為\(C_{n+k-1}^{n-1}\),也就是說\(f(x)\)展開式\(x^k\)對應的係數就是\(C_{n+k-1}^{n-1}\)(這也就是OI-wiki封閉形式五)
理解了上面的過程後,這道題目就非常簡單了,具體見OI-wiki的解答就好了
注意化簡的過程,最好把有窮級數也寫成分數的形式,這樣更好化簡