今天是生成函數了。
。。。
是我學的最難的多項式部分了。
其實我也可以說是現學現賣,學的不好講的不好大家見諒。
我之前講的大部分東西都可以和生成函數相結合。
生成函數分成三種。
我們一個一個來。
1.普通型生成函數(\(OGF\))
對於一個已知的數列\({a_i}\)。
其\(OGF\)為:
例如:\({1}\)的\(OGF\)就是:
很多時候我們用生成函數的原因是,我們可以把一個數列轉化成一個簡單的形式。
例如\(\frac{1}{1-x}\)
如果我們讓兩個\(OGF\)相乘會怎么樣呢?
簡單的例子:
比如說如果我們可以選兩個物品,分別從兩組中選擇。
第一組物品的體積和每種體積的物品種類用數列\({a_i}\)來表示。
第二組物品的體積和每種體積的物品種類用數列\({b_i}\)來表示。
設\({a_i}\)的\(OGF\)為\(A(x)\),\({b_i}\)的\(OGF\)為\(B(x)\)
那么\((A(x)B(x))_i\)就是選擇的兩個物品的體積和為\(i\)的方案數。
\(OGF\)經常來解決這種組合問題。
例:http://hzoj.com/contest/126/problem/5
裸的容斥題,我們將數列換成生成函數。
設一個的\(OGF\)為\(A(x)\)
兩個合在一起的為\(B(x)\)
三個合在一起的為\(C(x)\)
那么答案就是:
做四次\(DFT\)即可。
例:http://hzoj.com/problem/917
也挺裸的。
我們考慮求前綴和的過程是怎么樣的。
對於一個數列\({a_i}\),設其前綴和為\({b_i}\)
那么:
這個時候可以用多項式快速冪來搞了。
但是常數過大,\(ln+exp\)
這個題時限開到了\(200ms\)過不掉。
考慮如何優化。
我們設\(A(x)\)為\({1}\)的\(OGF\)。
那么:
考慮一下這個\(OGF\)自乘\(k\)次后第\(i\)項的系數是什么含義。
事實上是取\(k\)個自然數,加和之后為\(i\)的方案。
這樣直接用擋板解決就可以了。
這個系數就是:
那么也就是說:
這樣就只需要三次\(NTT\)了。
2.指數型生成函數(\(EGF\))
對於一個數列\({a_i}\)
其\(EGF\)為:
比如\(1\)的\(EGF\)為:
同樣是一個級數求和。
相比之下\(EGF\)用來解決排列問題。
比如說這樣一個問題:
從\(A\)中拿出任意多個相同物品,從\(B\)中拿出任意多個相同物品,如果認為拿出來的物品的順序不同視為不同方案,求拿出的物品個數為\(i\)的方案數。
設\(EGF\)為:$$G(x)=\sum\limits_{i=0}^{\infty}\frac{x^i}{i!}$$
設答案數組的\(EGF\)為:$$R(x)=\sum\limits_{i=0}^{\infty}\frac{res_i}{i!}x^i$$
那么:
這里就沒有\(OGF\)那么顯然了。
考慮一下為什么。
對於一個可重集合\(S\),設\(\left|S\right|=n\),設其中每種物品的個數為\(a_i\)。
那么這個集合的可重排列的方案就是:
這樣我們再來觀察這個卷積的過程。
相當於是把相同的物品的系數乘了一個\(\frac{1}{i!}\)
而最后的系數的和下面除了一個\(i!\),相當於可重集合上面乘的\(n!\)。
大概,可以懂吧?
例:http://hzoj.com/contest/126/problem/10
在大神們都用分治發發塔\(AC\)之后,我們再次看一下這道題能否有低於\(nlog^2n\)的復雜度。
設\(n\)個點無向圖的個數為\(g(n)=2^{\binom{n}{2}}\),設\(n\)個點聯通圖的個數為\(f(n)\)。
列出式子:
拆一下:
設\(G_0(x)=\sum\limits_{i=0}^{n}\frac{g(i+1)}{i!}x^i\),\(G_1(x)=\sum\limits_{i=0}^{n}\frac{g(i)}{i!}x^i\),\(F(x)=\sum\limits_{i=0}^{n}\frac{f(i+1)}{i!}x^i\)
這樣的話:
也就是一個多項式求逆了。
3.概率生成函數(咕咕咕我不會暫時不想學)\(Upd:\)已經學了。
我們設一個離散型隨機變量\(X\)的概率生成函數為:
那么:
也就是說:
這樣我們不斷的求導下去可以得到:
這樣也給除了一種便捷的求方差的方式:
4.應用
先來幾個\(EGF\)的。
fr.一個含有\(n\)個點的樹,如果令度數最大的點的度數為\(m\),求方案數。
\(prufer\)序列。
轉化為長度為\(n-2\)的序列中,\([1,n]\)中的數出現次數最多的為\(m-1\)次的方案數。
繼續轉化為,出現最大的為\(m-1\)減去出現最大的為\(m-2\)的。
構造生成函數:
那么:
se:http://hzoj.com/contest/126/problem/10
城市規划。還是這個題。
在各位大神甚至用生成函數和多項式求逆\(AC\)這道題之后我還想告訴你:
我們現在用\(EGF\)來搞一個更加無腦的做法。
我們設\(f(n)\)為\(n\)個點有標號無向聯通圖的個數,\(g(n)=2^{\binom{n}{2}}\)為\(n\)個點有標號無向圖。
設\(f(n)\)的\(EGF\)為:
我們枚舉一個無向圖有幾個聯通塊。
得到如下的式子:
那么:
直接多項式\(ln\)即可。
來幾個背包問題:
fr.體積為\(i\)的物品有\(a_i\)種,每種無限個,求\([0,n]\)所有容積的方案。
設體積為\(i\)的物品的\(OGF\)為\(F(x)\)
那么由於有無限個。
首先復習兩個級數求和公式:
所以:
設答案數組的\(OGF\)為\(A(x)\)
那么:
也就是說對於第\(j\)項,只需要累加\(j\)的倍數項。
那么復雜度是:
se.體積為\(i\)的物品有\(a_i\)種,每種有一個,求\([0,n]\)所有容積的方案。
設體積為\(i\)的物品的\(OGF\)為\(F_i(x)\)
那么:
設答案數組的\(OGF\)為\(A(x)\)。
那么:
一樣是調和級數的復雜度。