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

歡迎訪問 生活随笔!

生活随笔

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

生活经验

看不懂的生成函数

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

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

遭到了降智打擊

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

對于一個數(shù)列\(\{f_0,f_1,f_2,...,f_n\}\)

我們定義其生成函數(shù)為

\[F(x)=f_0+f_1x+f_2x^2+...+f_nx^n\]

也就是

\[F(x)=\sum_{i=0}^nf_ix^i\]

也就是把數(shù)列的每一項當成了多項式對應(yīng)項的系數(shù)

$$$$

既然是函數(shù),那么我們就可以去計算對應(yīng)的函數(shù)值

比如一個數(shù)列

\[\{1,1,1,1,1,1...\}\]

它的生成函數(shù)

\[F(x)=1+x+x^2+x^3+...\]

發(fā)現(xiàn)這是一個無窮等比數(shù)列

于是

\[F(x)=\frac{1-x^n}{1-x}\]

對于\(x\in (-1,1)\),當\(n\)趨于無窮的時候,\(x^n=0\)

于是

\[F(x)=\frac{1}{1-x}\]

對于一些特殊的數(shù)列,比如說

\[\{1,0,1,0,1,0,1,0,1...\}\]

也就是\(mod\ 2=0\)的項為\(1\),其余項為\(0\)

也就是

\[F(x)=x+x^2+x^4+...\]

簡單換一下元,就會發(fā)現(xiàn)\(F(x)=\frac{1}{1-x^2}\)

于是我們可以發(fā)現(xiàn)生成函數(shù)

\[F(x)=\frac{1}{1-x^k}\]

對應(yīng)的數(shù)列是一個\(k\)的倍數(shù)項為\(1\),其余項為\(0\)的數(shù)列

$$$$

這樣看也沒什么用啊,怎么能跟組合計數(shù)有關(guān)系呢

我們都學過多項式,我們知道我們可以用多項式的系數(shù)來表示方案數(shù)

我們來考慮一個最簡單多項式

\[A=1+x+x^2+x^3+...\]

\(A\)的第\(i\)項可以表示選取\(i\)個物品的方案數(shù)

寫成生成函數(shù)\(F(x)=\frac{1}{1-x}\)

那么\(A^k\)就表示從\(A\)中進行\(k\)次選取的方案數(shù),第\(i\)項就是選出\(i\)個物品的方案數(shù)

那么這個生成函數(shù)相乘表示什么呢

\[F^k(x)=\frac{1}{(1-x)^k}\]

\[A^k=\sum_{i=0}\binom{i-1+k}{k-1}x^i\]

這就是一個組合數(shù)插板就得出來了

根據(jù)我不知道的廣義二項式定理,上面的式子是相等的

于是我們得出一個重要結(jié)論

多項式的卷積對應(yīng)的就是兩個生成函數(shù)的乘積

$$$$

之后我們真的可以來做一道題了

LGP2000

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

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

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

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

  4. 必須是4的倍數(shù),\(F(x)=\frac{1}{1-x^4}\)

剩下的就不寫了,就是把每一個條件都抽象成生成函數(shù),之后對這些個生成函數(shù)求一個乘積,發(fā)現(xiàn)是\(F(x)=\frac{1}{(1-x)^5}\)

我們把這個轉(zhuǎn)化成多項式

\[\sum_{i=0}\binom{i-1+5}{5-1}x^i\]

我們要的是第\(n\)項系數(shù),也就是\(\binom{n+4}{4}\)這就是答案了

$$$$

生成函數(shù)更神仙的地方就在于推通項了

比如說\(fib\)數(shù)列

\[fib_n=\begin{cases}1&n\leq2\\fib_{n-1}+fib_{n-2}&n>2\end{cases}\]

其生成函數(shù)為

\[\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}\]

發(fā)現(xiàn)這個\(\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\)數(shù)列的生成函數(shù)了

但是這有什么用呢

可以求通項啊

我們把分母上的\(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)}\]

發(fā)現(xiàn)出現(xiàn)了諸如\(\frac{1}{1-cx}\)這樣的生成函數(shù)

我們知道這樣的生成函數(shù)對應(yīng)的多項式應(yīng)該形如\(\sum_{i=1}c^ix^i\)

所以就會有

\[fib_n=-\frac{1}{\sqrt5}(\frac{1-\sqrt5}{2})^n+\frac{1}{\sqrt5}(\frac{1+\sqrt5}{2})^n\]

真是優(yōu)雅自然

我們再來推一個難一點的數(shù)列,卡特蘭數(shù)

卡特蘭有一個遞推式是這個樣子的

\[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ā)現(xiàn)\(f_jx^j\)是對應(yīng)多項式的\(j\)次項,\(f_{i-j-1}x^{i-j-1}\)是對應(yīng)多項式的\(i-j-1\)次項,于是內(nèi)部還是一個卷積的形式也就是卡特蘭數(shù)自己卷自己,就是\(F^2(x)\)

于是

\[F(x)=1+xF^2(x)\]

這不是一元二次方程嗎,解一下這個方程

發(fā)現(xiàn)

\[F(x)=\frac{1\pm \sqrt{1-4x}}{2x}\]

發(fā)現(xiàn)竟然有一個正負號的問題

分式方程不好解我們上整式方程

設(shè)\(k=\frac{1\pm \sqrt{1-4x}}{2x}\)

\[2xk\pm \sqrt{1-4x}=1\]

盡管生成函數(shù)的\(x\)沒有什么意義,但是我們帶入\(x=0\)的時候,\(F(0)=f_0\),這是非常顯然的

于是

\[2\times 0\times 0\pm1=0\]

顯然那個符號應(yīng)該是正,由于這是移項過來的,于是在那邊應(yīng)該是個負號,所以

\[F(x)=\frac{1-\sqrt{1-4x}}{2x}\]

這個東西有什么用呢,可以搞卡特蘭數(shù)的通項!

我們發(fā)現(xiàn)那個\(\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\)個節(jié)點的二叉樹同構(gòu)的數(shù)量就是\(f_n\),卡特蘭數(shù)

現(xiàn)在的問題就是求一個分子,就是所有\(n\)個節(jié)點的二叉樹的同構(gòu)的葉子節(jié)點的個數(shù)

我們設(shè)為\(h_n\)

答案就是\(\frac{h_n}{f_n}\)

我們考慮一下\(h_n\)如何求

顯然我們可以利用一個類似卡特蘭的轉(zhuǎn)移

\[h_i=\sum_{i=0}^{j-1}h_jf_{i-j-1}+h_{i-j-1}f_j\]

就是枚舉左右兒子的節(jié)點個數(shù),之后由于要和另一個兒子組合,于是得乘上方案數(shù)

于是現(xiàn)在可以去寫一個\(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\)

考慮求這個函數(shù)的生成函數(shù)

\[\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}\]

設(shè)\(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}}\]

之后我就又不會做了,愉快地去看題解,發(fā)現(xiàn)果真還是菜啊

并不會求導,于是只能復述一下題解

\(xG(x)\)求導,發(fā)現(xiàn)

\[(xG(x))'=\frac{1}{\sqrt{1-4x}}=\frac{F(x)}{x}\]

據(jù)說\(xG(x)\)求導之后每一項從\(f_ix^{i+1}\)變成了\((i+1)f_ix^i\)

就等于對應(yīng)的\(\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}\]

我們利用卡特蘭數(shù)的通項公式\(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));}

這道題沒能推出通項不是很得勁,[國家集訓隊]整數(shù)的lqp拆分可以用生成函數(shù)推出通項來

我又來寫概率生成函數(shù)

感覺這個東西很玄幻啊

對于一個取值范圍為非負整數(shù)的離散隨機變量\(X\),我們定義其概率生成函數(shù)\(F(x)\)

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

也就是第\(i\)項的系數(shù)就是這個離散變量取到\(i\)的概率

于是就有兩個非常顯然的性質(zhì)

我們令\(x=1\)

\[F(1)=\sum_{i=0}^{\infty}P(X=i)=1\]

另一個性質(zhì),我們求一下導

\[F'(x)=\sum_{i=1}^{\infty}iP(X=i)x^{i-1}\]

繼續(xù)帶入\(x=1\)

驚奇的發(fā)現(xiàn)\(E(X)=F'(1)\),因為\(iP(X=i)\)這樣累加起來顯然就是期望值了

來看一道經(jīng)典的例題[CTSC2006]歌唱王國

我們定義\(f_i\)表示這個字符串在第\(i\)項結(jié)束的概率,我們再定義\(g_i\)表示到了第\(i\)項還沒有結(jié)束的概率,\(F(x),G(x)\)分別為這兩個序列的概率生成函數(shù)

顯然存在一條性質(zhì)\(g_{i-1}=f_{i}+g_{i}\),就是在\(i-1\)還沒有結(jié)束的概率就等于\(i\)點結(jié)束或者不結(jié)束的概率之和

我們用下一個點結(jié)束或者不結(jié)束的概率之和

我們用生成函數(shù)來寫這個柿子就是

\[1+xG(x)=G(x)+F(x)\]

求一個導,右邊是\(G'(x)+F'(x)\)

左邊的常數(shù)項求導玩就沒了,于是對\(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)\)顯然是對應(yīng)了一個還沒有結(jié)束的任意字符串,我們在后面補上一個原串,得到一個長度增加了\(L\)的新串,顯然這個新串是一定可以結(jié)束的,得到這樣一個新串的概率顯然就是\(G(x)\times \frac{1}{m^L}\)

由于我們強行補上這個新串,這個時候游戲一定結(jié)束了,但是很有可能游戲在這之前就已經(jīng)結(jié)束了

我們考慮一下如果當前已經(jīng)添加了\(i\)個字符游戲結(jié)束的情況,顯然這\(i\)字符既是原串的前綴也是原串的一個后綴,也就是我們經(jīng)常說的\(boder\)

于是如果\(i\)是一個\(boder\)的話,我們得來的這個字符串就相當于在長度增加了\(i\)的時候已經(jīng)結(jié)束的了一個字符串又欽定了\(L-i\)個字符

這樣就得到了上面的柿子

我們代入\(x=1\)試試看,發(fā)現(xiàn)

\[G(1)=\sum_{i=1}^La_im^i\]

我們要求的是啥來著,不就是\(E(x)=G(1)\)嗎,于是我們現(xiàn)在直接\(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;
}

轉(zhuǎn)載于:https://www.cnblogs.com/asuldb/p/10533453.html

總結(jié)

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

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。