「總結」多項式生成函數相關(3)


今天是生成函數了。
。。。
是我學的最難的多項式部分了。
其實我也可以說是現學現賣,學的不好講的不好大家見諒。
我之前講的大部分東西都可以和生成函數相結合。
生成函數分成三種。
我們一個一個來。

1.普通型生成函數(\(OGF\)
對於一個已知的數列\({a_i}\)
\(OGF\)為:

\[F(x)=\sum\limits_{i=0}^{\infty}a_ix^i \]

例如:\({1}\)\(OGF\)就是:

\[F(x)=\sum\limits_{i=0}^{\infty}x^i=\frac{1}{1-x} \]

很多時候我們用生成函數的原因是,我們可以把一個數列轉化成一個簡單的形式。
例如\(\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)\)
那么答案就是:

\[\frac{A^3(x)-3A(x)B(x)+2C(x)}{6}+\frac{A^2(x)-B(x)}{2}+A(x) \]

做四次\(DFT\)即可。

例:http://hzoj.com/problem/917
也挺裸的。
我們考慮求前綴和的過程是怎么樣的。
對於一個數列\({a_i}\),設其前綴和為\({b_i}\)
那么:

\[{b_i}={a_i}*{1}=\sum\limits_{j=0}^{i}a_j \]

這個時候可以用多項式快速冪來搞了。
但是常數過大,\(ln+exp\)
這個題時限開到了\(200ms\)過不掉。
考慮如何優化。
我們設\(A(x)\)\({1}\)\(OGF\)
那么:

\[A(x)=\sum\limits_{i=0}^{n}x^i \]

考慮一下這個\(OGF\)自乘\(k\)次后第\(i\)項的系數是什么含義。
事實上是取\(k\)個自然數,加和之后為\(i\)的方案。
這樣直接用擋板解決就可以了。
這個系數就是:

\[\binom{i+k-1}{k-1} \]

那么也就是說:

\[A^k(x)=\sum\limits_{i=0}^{n}\binom{k+i-1}{k-1}x^i \]

這樣就只需要三次\(NTT\)了。

2.指數型生成函數(\(EGF\))
對於一個數列\({a_i}\)
\(EGF\)為:

\[F(x)=\sum\limits_{i=0}^{\infty}\frac{a_i}{i!}x^i \]

比如\(1\)\(EGF\)為:

\[F(x)=\sum\limits_{i=0}^{\infty}\frac{x^i}{i!}=e^x \]

同樣是一個級數求和。
相比之下\(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$$
那么:

\[R(x)=G^2(x) \]

這里就沒有\(OGF\)那么顯然了。
考慮一下為什么。
對於一個可重集合\(S\),設\(\left|S\right|=n\),設其中每種物品的個數為\(a_i\)
那么這個集合的可重排列的方案就是:

\[\frac{n!}{\prod\limits_{i=1}^{w}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(n)=\sum\limits_{i=1}^{n}\binom{n-1}{i-1}f(i)g(n-i) \]

拆一下:

\[g(n)=\sum\limits_{i=1}^{n}\frac{(n-1)!}{(i-1)!(n-i)!}f(i)g(n-i) \]

\[\frac{g(n)}{(n-1)!}=\sum\limits_{i=1}^{n}\frac{f(i)}{(i-1)!}\frac{g(n-i)}{(n-i)!} \]

\(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\)
這樣的話:

\[G_0(x)=F(x)G_1(x) \]

\[F(x)=\frac{G_0(x)}{G_1(x)} \]

也就是一個多項式求逆了。

3.概率生成函數(咕咕咕我不會暫時不想學)\(Upd:\)已經學了。
我們設一個離散型隨機變量\(X\)的概率生成函數為:

\[F(x)=\sum\limits_{i=0}^{\infty}P(X=i)x^i \]

那么:

\[F'(x)=\sum\limits_{i=0}^{\infty}iP(X=i)x^i \]

也就是說:

\[F'(1)=\sum\limits_{i=0}^{\infty}iP(X=i)=E(X) \]

這樣我們不斷的求導下去可以得到:

\[F^{(k)}(1)=\sum\limits_{i=0}^{\infty}i^{\underline{k}}P(X=i)=E(X^{\underline{k}}) \]

這樣也給除了一種便捷的求方差的方式:

\[\begin{aligned} Var(X)&=E((X-E(X))^2)\\ &=E(X^2-2XE(X)+E^2(X))\\ &=E(X^2)-2E(X)E(X)+E^2(X)\\ &=E(X^2)-E^2(X)\\ &=E(X(X-1))+E(X)-E^2(X)\\ &=F''(1)+F'(1)-(F'(1))^2\\ \end{aligned}\]

4.應用
先來幾個\(EGF\)的。

fr.一個含有\(n\)個點的樹,如果令度數最大的點的度數為\(m\),求方案數。

\(prufer\)序列。
轉化為長度為\(n-2\)的序列中,\([1,n]\)中的數出現次數最多的為\(m-1\)次的方案數。
繼續轉化為,出現最大的為\(m-1\)減去出現最大的為\(m-2\)的。
構造生成函數:

\[F(x)=\sum\limits_{i=0}^{m-1}\frac{x^i}{i!} \]

那么:

\[ans=[x^{n-2}]F^n(n) \]

se:http://hzoj.com/contest/126/problem/10
城市規划。還是這個題。
在各位大神甚至用生成函數和多項式求逆\(AC\)這道題之后我還想告訴你:

\[我沒有腦子都可以切這題。 \]

我們現在用\(EGF\)來搞一個更加無腦的做法。
我們設\(f(n)\)\(n\)個點有標號無向聯通圖的個數,\(g(n)=2^{\binom{n}{2}}\)\(n\)個點有標號無向圖。
\(f(n)\)\(EGF\)為:

\[F(x)=\sum\limits_{i=0}^{\infty}\frac{f(i)x^i}{i!} \]

\[G(x)=\sum\limits_{i=0}^{\infty}\frac{g(i)x^i}{i!} \]

我們枚舉一個無向圖有幾個聯通塊。
得到如下的式子:

\[G(x)=\sum\limits_{i=0}^{\infty}\frac{F^i(x)}{i!}=e^{F(x)} \]

那么:

\[F(x)=ln(G(x)) \]

直接多項式\(ln\)即可。

來幾個背包問題:
fr.體積為\(i\)的物品有\(a_i\)種,每種無限個,求\([0,n]\)所有容積的方案。
設體積為\(i\)的物品的\(OGF\)\(F(x)\)
那么由於有無限個。
首先復習兩個級數求和公式:

\[\sum\limits_{i=0}^{\infty}x^j=\frac{1}{1-x} \]

\[\sum\limits_{i=1}^{\infty}\frac{x^j}{j}=-ln(1-x) \]

所以:

\[F(x)=\sum\limits_{i=0}^{\infty}(x^i)^j \]

設答案數組的\(OGF\)\(A(x)\)
那么:

\[\begin{aligned}\\ A(x)&=\prod\limits_{i=1}^{n}F_i^{a_i}(x)\\ &=\prod\limits_{i=1}^{n}(\sum\limits_{i=0}^{\infty}(x^i)^j)^{a_i}\\ &=\prod\limits_{i=1}^{n}(\frac{1}{1-x^i})^{a_i}\\ &=exp(ln(\prod\limits_{i=1}^{n}(\frac{1}{1-x^i})^{a_i}))\\ &=exp(\sum\limits_{i=1}^{n}a_i(0-ln(1-x^i)))\\ &=exp(\sum\limits_{i=1}^{n}a_i(-ln(1-x^i)))\\ &=exp(\sum\limits_{i=1}^{n}a_i\sum\limits_{j=1}^{\infty}\frac{(x^i)^j}{j})\\ &=exp(\sum\limits_{j=1}^{\infty}\frac{1}{j}\sum\limits_{i=1}^{n}a_i(x^j)^i)\\ &=exp(\sum\limits_{j=1}^{\infty}\frac{1}{j}A(x^j))\\ \end{aligned}\]

也就是說對於第\(j\)項,只需要累加\(j\)的倍數項。
那么復雜度是:

\[\sum\limits_{i=1}^{n}\frac{n}{i}=n\sum\limits_{i=1}^{n}\frac{1}{i}=nH_n=nln(n) \]

se.體積為\(i\)的物品有\(a_i\)種,每種有一個,求\([0,n]\)所有容積的方案。
設體積為\(i\)的物品的\(OGF\)\(F_i(x)\)
那么:

\[F_i(x)=1+x^i \]

設答案數組的\(OGF\)\(A(x)\)
那么:

\[\begin{aligned}\\ A(x)&=\prod\limits_{i=1}^{n}F_i^{a_i}(x)\\ &=\prod\limits_{i=1}^{n}(1+x^i)^{a_i}\\ &=exp(ln(\prod\limits_{i=1}^{n}(1+x^i)^{a_i}))\\ &=exp(\sum\limits_{i=1}^{n}a_iln(1+x^i))\\ &=exp(\sum\limits_{i=1}^{n}a_i\sum\limits_{j=1}^{\infty}\frac{(-1)^{j-1}(x^i)^j}{j})\\ &=exp(\sum\limits_{j=1}^{\infty}\frac{(-1)^{j-1}}{j}\sum\limits_{i=1}^{n}a_i(x^j)^i)\\ &=exp(\sum\limits_{j=1}^{\infty}\frac{(-1)^{j-1}}{j}A(x^j))\\ \end{aligned}\]

一樣是調和級數的復雜度。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM