生成函數(母函數)的簡單應用

同步個人博客 http://sxysxy.org/blogs/15 到csdn

Simple

一個簡單的問題,給定一個數k,從集合A中選一個數a,集合B中選一個數b,使得a+b = k的方案數有多少?

掃描A的所有元素a然後在B裏面找k-a --> 哈希/平衡樹/stl大fa好!!!

3個集合A,B,C呢?n個集合呢?複雜度蹭蹭蹭地就不知道高到哪裏去了。(假設每個集合裏面的數約爲k個,可以試着計算n個集合時這樣暴力法做的複雜度)

生成函數

這是一類組合計數問題。

對於上面那個例子,例如k = 2 , A = {1, 2}, B = {0, 1} 人工計算也能得出有2種方案(k = a+b = 2+0 = 1+1 兩種方案)

現在用生成函數來計算。定義A(x) = x^1 + x^2 = x^2 + x, B(x) = x^0 + x^1 = x+1,則令C(x) = A(x) × B(x) = x^3+x^2+x^2+x = x^3 + 2x^2 + x

C(x)爲函數(其實這裏也是多項式)A(x) 與B(x)的乘積,C(x)的2次項係數爲恰爲2,就表示從集合A中選出a從集合B中選出b使得a+b=2的方案數。同時,3次項係數爲1就是a+b=3的方案數爲1,1次項係數爲1意味着是a+b=1的方案數爲1。不存在的m次項(即係數爲0)則表示不存在方案使得a+b=m。

再例如A = {x | x∈N 且x是5的倍數},B = {2, 3, 4}, C = {0, 4, 5}從中分別取出數a,b,c

那麼要計算任意a+b+c = m的方案數,就是看 (1+x^5+x^10+……)(x^2+x^3+x^4)(1+x^4+x^5)最後結果m次項前的係數即可。將組合計數問題轉化爲乘法問題

一點微小的優化

爲什麼前面強調他們的生成函數是個多項式?(PS:注意並不是所有的都是多項式)~,因爲多項式乘法可以FFT加速啊,這樣複雜度又降低了,出題人又可以增大數據範圍了,真(毒)是妙(瘤)啊!

一道練習生成函數的好題 http://syzoj.com/problem/188

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章