看不懂的生成函数
不得不說這個東西真是妙啊
遭到了降智打擊
生成函數又叫做母函數,主要用于解決一些組合數學問題
對于一個數列\(\{f_0,f_1,f_2,...,f_n\}\)
我們定義其生成函數為
\[F(x)=f_0+f_1x+f_2x^2+...+f_nx^n\]
也就是
\[F(x)=\sum_{i=0}^nf_ix^i\]
也就是把數列的每一項當成了多項式對應項的系數
$$$$
既然是函數,那么我們就可以去計算對應的函數值
比如一個數列
\[\{1,1,1,1,1,1...\}\]
它的生成函數
\[F(x)=1+x+x^2+x^3+...\]
發現這是一個無窮等比數列
于是
\[F(x)=\frac{1-x^n}{1-x}\]
對于\(x\in (-1,1)\),當\(n\)趨于無窮的時候,\(x^n=0\)
于是
\[F(x)=\frac{1}{1-x}\]
對于一些特殊的數列,比如說
\[\{1,0,1,0,1,0,1,0,1...\}\]
也就是\(mod\ 2=0\)的項為\(1\),其余項為\(0\)
也就是
\[F(x)=x+x^2+x^4+...\]
簡單換一下元,就會發現\(F(x)=\frac{1}{1-x^2}\)
于是我們可以發現生成函數
\[F(x)=\frac{1}{1-x^k}\]
對應的數列是一個\(k\)的倍數項為\(1\),其余項為\(0\)的數列
$$$$
這樣看也沒什么用啊,怎么能跟組合計數有關系呢
我們都學過多項式,我們知道我們可以用多項式的系數來表示方案數
我們來考慮一個最簡單多項式
\[A=1+x+x^2+x^3+...\]
\(A\)的第\(i\)項可以表示選取\(i\)個物品的方案數
寫成生成函數\(F(x)=\frac{1}{1-x}\)
那么\(A^k\)就表示從\(A\)中進行\(k\)次選取的方案數,第\(i\)項就是選出\(i\)個物品的方案數
那么這個生成函數相乘表示什么呢
\[F^k(x)=\frac{1}{(1-x)^k}\]
而
\[A^k=\sum_{i=0}\binom{i-1+k}{k-1}x^i\]
這就是一個組合數插板就得出來了
根據我不知道的廣義二項式定理,上面的式子是相等的
于是我們得出一個重要結論
多項式的卷積對應的就是兩個生成函數的乘積
$$$$
之后我們真的可以來做一道題了
LGP2000
先把所有的限制條件變成多項式和生成函數
必須是6的倍數,那么就是\(F(x)=\frac{1}{1-x^6}\)
最多用\(9\)塊,也就是一個只有前\(10\)項系數為\(1\)的多項式,一個等比數列求和,\(F(x)=\frac{1-x^{10}}{1-x}\)
最多用5塊,\(F(x)=\frac{1-x^{6}}{1-x}\)
必須是4的倍數,\(F(x)=\frac{1}{1-x^4}\)
剩下的就不寫了,就是把每一個條件都抽象成生成函數,之后對這些個生成函數求一個乘積,發現是\(F(x)=\frac{1}{(1-x)^5}\)
我們把這個轉化成多項式
\[\sum_{i=0}\binom{i-1+5}{5-1}x^i\]
我們要的是第\(n\)項系數,也就是\(\binom{n+4}{4}\)這就是答案了
$$$$
生成函數更神仙的地方就在于推通項了
比如說\(fib\)數列
\[fib_n=\begin{cases}1&n\leq2\\fib_{n-1}+fib_{n-2}&n>2\end{cases}\]
其生成函數為
\[\begin{aligned} F(x)=&\sum_{i=1}fib_ix^i\\&=\sum_{i=1}(fib_{i-1}+fib_{i-2}+[i=1])x^i\\&=\sum_{i=1}fib_{i-1}x^i+\sum_{i=1}fib_{i-2}x^i+x\\&=x\sum_{i=1}fib_{i-1}x^{i-1}+x^2\sum_{i=1}fib_{i-2}x^{i-2}+x\\\end{aligned}\]
發現這個\(\sum_{i=1}fib_{i-1}x^{i-1}\)和\(\sum_{i=1}fib_{i-2}x^{i-2}\)不都是\(F(x)\)嗎
于是就有
\[F(x)=xF(x)+x^2F(x)+x\]
于是我們可以求得
\[F(x)=\frac{x}{1-x-x^2}\]
這就是\(fib\)數列的生成函數了
但是這有什么用呢
可以求通項啊
我們把分母上的\(1-x-x^2\)因式分解一下
\[F(x)=\frac{x}{(1-\frac{1-\sqrt5}{2}x)(1-\frac{1+\sqrt5}{2}x)}\]
在搞一搞
\[F(x)=-\frac{1}{\sqrt5}\frac{1}{(1-\frac{1-\sqrt5}{2}x)} + \frac{1}{\sqrt5}\frac{1}{(1-\frac{1+\sqrt5}{2}x)}\]
發現出現了諸如\(\frac{1}{1-cx}\)這樣的生成函數
我們知道這樣的生成函數對應的多項式應該形如\(\sum_{i=1}c^ix^i\)
所以就會有
\[fib_n=-\frac{1}{\sqrt5}(\frac{1-\sqrt5}{2})^n+\frac{1}{\sqrt5}(\frac{1+\sqrt5}{2})^n\]
真是優雅自然
我們再來推一個難一點的數列,卡特蘭數
卡特蘭有一個遞推式是這個樣子的
\[f_n=\begin{cases}1&n=0\\\sum_{i=0}^{n-1}f_if_{n-i-1}&n>0\end{cases}\]
我們照樣來推一下
\[\begin{aligned} F(x)&=\sum_{i=0}(\sum_{j=0}^{i-1}f_jf_{i-j-1}+[i=0])x^i\\&=1+\sum_{i=1}(\sum_{j=0}^{i-1}f_jf_{i-j-1})x^i\\&=1+x\sum_{i=1}(\sum_{j=0}^{i-1}f_jf_{i-j-1})x^{i-1}\end{aligned}\]
考慮把\(x^{i-1}\)分成\(x^{j}\times x^{i-j-1}\),之后分進去
就是
\[\begin{aligned} F(x)&=1+x\sum_{i=1}\sum_{j=0}^{i-1}f_jx^j\times f_{i-j-1}x^{i-j-1}\end{aligned}\]
驚奇的發現\(f_jx^j\)是對應多項式的\(j\)次項,\(f_{i-j-1}x^{i-j-1}\)是對應多項式的\(i-j-1\)次項,于是內部還是一個卷積的形式也就是卡特蘭數自己卷自己,就是\(F^2(x)\)
于是
\[F(x)=1+xF^2(x)\]
這不是一元二次方程嗎,解一下這個方程
發現
\[F(x)=\frac{1\pm \sqrt{1-4x}}{2x}\]
發現竟然有一個正負號的問題
分式方程不好解我們上整式方程
設\(k=\frac{1\pm \sqrt{1-4x}}{2x}\)
\[2xk\pm \sqrt{1-4x}=1\]
盡管生成函數的\(x\)沒有什么意義,但是我們帶入\(x=0\)的時候,\(F(0)=f_0\),這是非常顯然的
于是
\[2\times 0\times 0\pm1=0\]
顯然那個符號應該是正,由于這是移項過來的,于是在那邊應該是個負號,所以
\[F(x)=\frac{1-\sqrt{1-4x}}{2x}\]
這個東西有什么用呢,可以搞卡特蘭數的通項!
我們發現那個\(\sqrt{1-4x}\)就是\((1-4x)^{\frac{1}{2}}\),嘗試二項式定理
\[(1-4x)^{\frac{1}{2}}=\sum_{i=0}\binom{\frac{1}{2}}{i}(-4x)^i\]
推不動了,先棄療了
$$$$
來一道神仙題
[TJOI2015]概率論
感性理解一下這個\(n\)個節點的二叉樹同構的數量就是\(f_n\),卡特蘭數
現在的問題就是求一個分子,就是所有\(n\)個節點的二叉樹的同構的葉子節點的個數
我們設為\(h_n\)
答案就是\(\frac{h_n}{f_n}\)
我們考慮一下\(h_n\)如何求
顯然我們可以利用一個類似卡特蘭的轉移
\[h_i=\sum_{i=0}^{j-1}h_jf_{i-j-1}+h_{i-j-1}f_j\]
就是枚舉左右兒子的節點個數,之后由于要和另一個兒子組合,于是得乘上方案數
于是現在可以去寫一個\(O(n^2)\)的了
f[0]=1,f[1]=1;for(re int i=2;i<=n;i++)for(re int j=0;j<i;j++) f[i]+=f[j]*f[i-j-1];h[0]=0,h[1]=1;for(re int i=2;i<=n;i++)for(re int j=0;j<i;j++) h[i]+=f[i-j-1]*h[j]+f[j]*h[i-j-1];printf("%.12lf",double(h[n])/double(f[n])); 考慮到這個形式我們并不是很好化簡,于是考慮到\(f_jh_{i-j-1}\)會被算到兩次
于是直接寫成
\[h_i=2\sum_{i=0}^{j-1}h_jf_{i-j-1}\]
我們得特殊定義一下\(h_1=1\)
考慮求這個函數的生成函數
\[\begin{aligned}F(x)=&\sum_{i=1}(2\sum_{j=0}^{i-1}h_jf_{i-j-1}+[i=1])x^i\\&=x+\sum_{i=1}(2\sum_{j=0}^{i-1}h_jf_{i-j-1})x^i\\&=x+x\sum_{i=1}(2\sum_{j=0}^{i-1}h_jf_{i-j-1})x^{i-1}\\&=x+x\sum_{i=1}2\sum_{j=0}^{i-1}h_jx_j\times f_{i-j-1}x^{i-j-1}\end{aligned}\]
設\(G(x)=\sum_{i=0}f_ix^i\)
于是
\[\begin{aligned}F(x)=&x+2xF(x)G(x)\end{aligned}\]
我們知道\(G(x)=\frac{1-\sqrt{1-4x}}{2x}\)
于是我們可以解得
\[F(x)=\frac{x}{\sqrt{1-4x}}\]
之后我就又不會做了,愉快地去看題解,發現果真還是菜啊
并不會求導,于是只能復述一下題解
對\(xG(x)\)求導,發現
\[(xG(x))'=\frac{1}{\sqrt{1-4x}}=\frac{F(x)}{x}\]
據說\(xG(x)\)求導之后每一項從\(f_ix^{i+1}\)變成了\((i+1)f_ix^i\)
就等于對應的\(\frac{F(x)}{x}\)的每一項\(h_ix^{i-1}\),也就是\(h_{i+1}x^i\)
也就是說我們得到了
\[h_{i+1}x^{i}=(i+1)f_ix^i\]
就是
\[h_{i+1}=(i+1)f_i\]
所以\(h_i=if_{i-1}\)
之后我們的答案就是
\[\frac{nf_{n-1}}{f_n}\]
我們利用卡特蘭數的通項公式\(f_n=\frac{1}{n+1}\binom{2n}{n}\)
于是
\[\begin{aligned}\frac{nf_{n-1}}{f_n}&=\frac{n\frac{1}{n}\binom{2n-2}{n-1}}{\frac{1}{n+1}\binom{2n}{n}}\\&=\frac{(n+1)\frac{(2n-2)!}{(n-1)!(n-1)!}}{\frac{(2n)!}{n!n!}}\\&=\frac{(2n-2)!n!n!(n+1)}{(2n)!(n-1)!(n-1)!}\\&=\frac{n^2(n+1)}{2n(2n-1)}=\frac{n(n+1)}{2(2n-1)}\end{aligned}\]
于是一行就寫完了
#include<cstdio>
int main() {double n;scanf("%lf",&n);printf("%.12lf\n",n*(n+1)/2/(2*n-1));} 這道題沒能推出通項不是很得勁,[國家集訓隊]整數的lqp拆分可以用生成函數推出通項來
我又來寫概率生成函數了
感覺這個東西很玄幻啊
對于一個取值范圍為非負整數的離散隨機變量\(X\),我們定義其概率生成函數\(F(x)\)為
\[F(x)=\sum_{i=0}^{\infty}P(X=i)x^i\]
也就是第\(i\)項的系數就是這個離散變量取到\(i\)的概率
于是就有兩個非常顯然的性質
我們令\(x=1\)
\[F(1)=\sum_{i=0}^{\infty}P(X=i)=1\]
另一個性質,我們求一下導
\[F'(x)=\sum_{i=1}^{\infty}iP(X=i)x^{i-1}\]
繼續帶入\(x=1\)
驚奇的發現\(E(X)=F'(1)\),因為\(iP(X=i)\)這樣累加起來顯然就是期望值了
來看一道經典的例題[CTSC2006]歌唱王國
我們定義\(f_i\)表示這個字符串在第\(i\)項結束的概率,我們再定義\(g_i\)表示到了第\(i\)項還沒有結束的概率,\(F(x),G(x)\)分別為這兩個序列的概率生成函數
顯然存在一條性質\(g_{i-1}=f_{i}+g_{i}\),就是在\(i-1\)還沒有結束的概率就等于\(i\)點結束或者不結束的概率之和
我們用下一個點結束或者不結束的概率之和
我們用生成函數來寫這個柿子就是
\[1+xG(x)=G(x)+F(x)\]
求一個導,右邊是\(G'(x)+F'(x)\)
左邊的常數項求導玩就沒了,于是對\(xG(x)\)求導
\[(xG(x))'=\sum_{i=0}^{\infty}(i+1)g_ix^{i+1-1}=\sum_{i=0}^{\infty}g_ix^i+\sum_{i=0}^{\infty}ig_ix^{i-1+1}=G(x)+xG'(x)\]
于是
\[G'(x)+F'(x)=G(x)+xG'(x)\]
當\(x=1\)時就有\(F'(x)=G(x)=E(x)\)
于是我們只需要求一個\(G(x)\)就好了
之后就會這樣一個柿子
\[G(x)(\frac{1}{m}x)^L=\sum_{i=1}^La_iF(x)(\frac{1}{m}x)^{L-i}\]
其中\(a_i\)表示\(i\)前綴是否是一個\(boder\)
看起來有點嚇人啊,但是我們可以這樣來理解
\(G(x)\)顯然是對應了一個還沒有結束的任意字符串,我們在后面補上一個原串,得到一個長度增加了\(L\)的新串,顯然這個新串是一定可以結束的,得到這樣一個新串的概率顯然就是\(G(x)\times \frac{1}{m^L}\)
由于我們強行補上這個新串,這個時候游戲一定結束了,但是很有可能游戲在這之前就已經結束了
我們考慮一下如果當前已經添加了\(i\)個字符游戲結束的情況,顯然這\(i\)字符既是原串的前綴也是原串的一個后綴,也就是我們經常說的\(boder\)
于是如果\(i\)是一個\(boder\)的話,我們得來的這個字符串就相當于在長度增加了\(i\)的時候已經結束的了一個字符串又欽定了\(L-i\)個字符
這樣就得到了上面的柿子
我們代入\(x=1\)試試看,發現
\[G(1)=\sum_{i=1}^La_im^i\]
我們要求的是啥來著,不就是\(E(x)=G(1)\)嗎,于是我們現在直接\(O(L)\)的時間算出\(G(1)\)就好了
代碼
#include<cstdio>
#define re register
const int maxn=1e5+5;
const int mod=10000;
int T,pw[maxn],ans,a[maxn],nx[maxn],m,n;
int main() {scanf("%d%d",&m,&T);pw[0]=1;for(re int i=1;i<maxn;i++) pw[i]=1ll*pw[i-1]*m%mod;while(T--) {scanf("%d",&n);ans=0;for(re int i=1;i<=n;i++) scanf("%d",&a[i]);for(re int i=2;i<=n;i++) {nx[i]=0;int p=nx[i-1];while(p&&a[i]!=a[p+1]) p=nx[p];nx[i]=p+(a[i]==a[p+1]);}while(n) ans=(ans+pw[n])%mod,n=nx[n];if(ans<1000) putchar('0');if(ans<100) putchar('0');if(ans<10) putchar('0');printf("%d\n",ans);}return 0;
}
轉載于:https://www.cnblogs.com/asuldb/p/10533453.html
總結
- 上一篇: 植牙多少钱啊?
- 下一篇: silk mask面膜多少钱