母函式又名生成函式
是一種重要的數論函式
多用於求解組合數問題、遞推問題
母函式包括很多種
例如普通母函式、指數母函式、l級數、貝爾級數和狄利克雷級數
而普通母函式
的理解則是
把組合問題的加法法則和冪級數的的乘冪的相加對應起來
總之母函式的思想就是
把離散數列和冪級數一一對應起來,把離散數列間的相互結合關係對應成為冪級數間的運算關係
最後由冪級數形式來確定離散數列的構造
從經典的例子開始
題目:有1克、2克、3克、4克的砝碼各一 枚,能稱出哪幾種重量?每種重量各有幾種可能方案?
若是使用窮舉法
那麼原題的複雜度可以達到o(n^4)
當砝碼數量達到了m個時
原題的複雜度就成了o(n^m)
若我們使用母函式
複雜度則可以降到o(n^3)
窮舉的細節簡單模擬一下
1先假設使用乙個1g的砝碼,然後再假設在此情況下,使用2g的砝碼,在此基礎上,
2再假設使用乙個3g的,再假設使用乙個4g的,這就是1中情況,
3顯然,這種方案稱出的重量為10g,然後改變上面的乙個假設條件,
4比如假設沒有使用4g的,只是用了1g、2g、3g,顯然這種方案稱出的是6g,
5以此類推,將所有的可能列舉出來後即可得到全部的方案,1g的砝碼有兩種情況,
6使用還是不使用,其他的砝碼也一樣,每一種1g砝碼的狀態都可以有兩種砝碼狀態,
7 以此類推總共就有2*2*2*2=16中方案,當然其中包含一種乙個砝碼也沒有的0g方案。
最後窮盡結果為
1g、2g、8g、9g、10g各有一種方案
3g、4g、5g、6g、7g各有兩種
總共十五種
嗯……我接下來這段也不知道該怎麼講
所以引用一下別人的
我們可以用乙個類似離散數學的邏輯式表示前兩種砝碼組合出來的情況
我在這裡使用||表示析取,也就是程式設計時的「邏輯或」;
用&&表示合取,也就是程式設計時的「邏輯與」,析取與合取都是離散數學中的概念,其實就等於程式語言中的邏輯與和邏輯或,析取與合取的符號ˆ和ˇ很多人雖學過並不熟悉,我就用程式語言中的符號代替了,熟悉離散數學的人可以轉換成析取與合取的符號。
(使用1g || 不使用1g)&&(使用2g || 不使用2g)
=使用1g&&使用2g || 不使用1g&&使用2g || 使用1g&&不使用2g || 不使用1g&&不使用2g
每個用 「||」分開的一項都是一種方案。「&&」表示選擇第一項的情況下有選擇了第二項。
大家可以發現這個表示式和一種表示式很像,沒錯,如果把「||」看成加法,「&&」看成乘法,和多項式的乘法一模一樣。
那麼我們直覺的想到,有沒有可能用多項式乘法來表示組合的情況呢?我們再來看題目,題目需要的是幾種砝碼組合後的重量,是乙個加法關係,
但是在上式中「&&」是一種類似於乘法的運算關係,這怎麼辦呢?有沒有什麼這樣一種運算關係,以乘法的形式運算,但是結果表現出類似於加法的關係呢?
正好有乙個,那就是冪運算。xm 乘上xn結果是xm+n,他完美的符合了我們的要求。
那麼以次數表示砝碼的質量, 就可以以多項式的形式表示砝碼組合的所有方案。
還是以前兩個砝碼為例說明,表示1g砝碼的兩種狀態的多項式就是(x0+x1),表示2g的就是(x0+x2),x0表示沒有使用砝碼,所以重量為0,
當然了因為x0 =1,所以也可以寫成1,後面為了方便我會這麼寫。
注意,砝碼的質量是以次數表示的,而不是直覺上的用下標表示為x1,x2。
這點很重要,不然的話就無法表現出冪運算的關係了。
(x0+x1)*(x0+x2)
=x0*x0 + x1*x0 + x0*x2 + x1*x2
=x0 + x1 + x2 + x3
很顯然我們可以用4個砝碼來遞推
(x0+x1)* (x0+x2) * (x0+x3)* (x0+x4)
=x0 + x1 + x2 + 2x3 + 2x4 + 2x5 + 2x6 + 2x7 + x8+ x9 + x10
和我們的結果一樣
如果將每砝碼數量換成無限的
那麼之前的式子大概可以寫成
(x0 +x1 + x2 + x3 + x4 + x5 + …… )*(x0 + x2 + x4 + x6 + x8+ x10 + ……)
第乙個多項式
表示1g砝碼每種數目都只有一種方案來組成
同理第二者用來表明
2的倍數的砝碼只有一種方案來表示
多項式乘法不多bb,o(n^2)複雜度,再疊加乙個迴圈
達到o(n^3)
足夠優化了吧
這種複雜度遇到正常一點的題
直接就當場裂開
所以你還需要學
其他的東西來輔助 誰輔助誰呀
欸比如你需要
fft來優化多項式乘法
於是複雜度到了o(nm log m)
就這?還是不行
所以必要時需要
另闢蹊徑把所有生成函式取ln
然後exp
所以為了這兩個輔助品
你還需要學
有關複數的一些性質
單位根的性質
多項式卷積
這還僅是fft
exp這個就直接裂開
我根本不會,只是在一篇題解上見到過
-end-
普通母函式
hdu 1028 將乙個整數寫成幾個整數的加和,一共可以寫出多少種。數字相同順序不同算一種 includeusing namespace std int a 122 b 122 int main for int j 1 j n j printf d n a n return 0 hdu 2082 假...
普通型母函式模板理解
今天學習了一下母函式的知識,感覺它像是專門做一類題用的。推薦乙個比較好的入門的母函式部落格 我寫這篇文章的目的,就是為了再次總結一下他寫的那個模板,畢竟看了很久才懂的。這裡我以 hdu 1028 這道題為例 這道題目的大致意思是 給你乙個正整數n,然後要你求有多少種可以加到n的方式。include ...
hdu2082 簡單母函式
題目大意 a,b,c,d.z這些字母的價值是1,2,3.26 給定 這26個字母分別的數量,求總價值不超過50的單詞的數量 分析 標準做法是構造母函式 把某個單詞看作是,關於x的多項式,在這個多項式中 形如 a x b 這樣的項就代表 價值為b的單詞有a個。做法 其實不知道母函式也完全可以做。就是個...