日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 人文社科 > 生活经验 >内容正文

生活经验

看不懂的生成函数

發布時間:2023/11/27 生活经验 24 豆豆
生活随笔 收集整理的這篇文章主要介紹了 看不懂的生成函数 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

不得不說這個東西真是妙啊

遭到了降智打擊

生成函數又叫做母函數,主要用于解決一些組合數學問題

對于一個數列\(\{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

先把所有的限制條件變成多項式和生成函數

  1. 必須是6的倍數,那么就是\(F(x)=\frac{1}{1-x^6}\)

  2. 最多用\(9\)塊,也就是一個只有前\(10\)項系數為\(1\)的多項式,一個等比數列求和,\(F(x)=\frac{1-x^{10}}{1-x}\)

  3. 最多用5塊,\(F(x)=\frac{1-x^{6}}{1-x}\)

  4. 必須是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

總結

以上是生活随笔為你收集整理的看不懂的生成函数的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。