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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

P4548-[CTSC2006]歌唱王国【概率生成函数,KMP】

發布時間:2023/12/3 编程问答 20 豆豆
生活随笔 收集整理的這篇文章主要介紹了 P4548-[CTSC2006]歌唱王国【概率生成函数,KMP】 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

正題

題目鏈接:https://www.luogu.com.cn/problem/P4548


題目大意

ttt次詢問,給出一個長度為mmm的串SSS和一個空串TTT,每次在TTT后面隨機加入1~n1\sim n1n的字符,直到TTT中出現SSS為止,求期望次數。

1≤n≤105,t≤50,1≤m≤1051\leq n\leq 10^5,t\leq 50,1\leq m\leq 10^51n105,t50,1m105


解題思路

對于一個隨機的數字XXX,它的概率生成函數是一個形如
F(x)=∑i=0∞P(X=i)xiF(x)=\sum_{i=0}^\infty P(X=i)x^iF(x)=i=0?P(X=i)xi
F′(x)=∑i=1∞P(X=i)ixi?1F'(x)=\sum_{i=1}^\infty P(X=i)ix^{i-1}F(x)=i=1?P(X=i)ixi?1
不難發現數字XXX的期望值就是E(X)=F′(1)E(X)=F'(1)E(X)=F(1)
然后還有一個不知道有啥用的XXX的方差(大概就是離散程度)
V(X)=F′′(1)+F′(1)?F′(1)2V(X)=F''(1)+F'(1)-F'(1)^2V(X)=F(1)+F(1)?F(1)2

這題的話,設兩個生成函數,F(x)F(x)F(x)表示停止時間XXX的概率生成函數,還有一個G(x)G(x)G(x)表示沒有停止時間的概率(不是概率生成函數),具體地
G(x)=∑i=0∞P(i<X)xiG(x)=\sum_{i=0}^\infty P(i<X)x^iG(x)=i=0?P(i<X)xi
然后我們就有兩個式子
xG(x)+1=F(x)+G(x)xG(x)+1=F(x)+G(x)xG(x)+1=F(x)+G(x)
這個式子的含義很好理解,在還沒有結束的序列后面加入一個字符要么結束了要么沒結束。
(xn)mG(x)=∑i=1m(xn)m?ibiF(x)\left(\frac{x}{n}\right)^mG(x)=\sum_{i=1}^m \left(\frac{x}{n}\right)^{m-i}b_iF(x)(nx?)mG(x)=i=1m?(nx?)m?ibi?F(x)
bib_ibi?表示iii是否是串SSS的一個borderborderborder,這個式子的意思就是說在直接在未結束的TTT后面插入一個SSS,此時可能提前結束。

然后這兩個式子怎么用呢,我們對第一個式子求導就有
G(x)+G′(x)=F′(x)+G′(x)?F′(x)=G(x)G(x)+G'(x)=F'(x)+G'(x)\Rightarrow F'(x)=G(x)G(x)+G(x)=F(x)+G(x)?F(x)=G(x)
也就是說我們要求的E(X)=F′(1)=G(1)E(X)=F'(1)=G(1)E(X)=F(1)=G(1)
然后直接帶入第二個式子,因為有F(1)=1F(1)=1F(1)=1,所以
(1n)mG(1)=∑i=1m(1n)m?ibiF(1)\left(\frac{1}{n}\right)^mG(1)=\sum_{i=1}^m \left(\frac{1}{n}\right)^{m-i}b_iF(1)(n1?)mG(1)=i=1m?(n1?)m?ibi?F(1)
?G(1)=∑i=1mnibi\Rightarrow G(1)=\sum_{i=1}^mn^ib_i?G(1)=i=1m?nibi?
KMPKMPKMP求出bbb數組即可。

時間復雜度O(Tm)O(Tm)O(Tm)


code

#include<cstdio> #include<cstring> #include<algorithm> #define ll long long using namespace std; const ll N=1e5+10,P=1e4; ll T,m,n,pw[N],a[N],nxt[N]; signed main() {scanf("%lld%lld",&m,&T);pw[0]=1;for(ll i=1;i<N;i++)pw[i]=pw[i-1]*m%P;while(T--){scanf("%lld",&n);ll ans=0;for(ll i=1;i<=n;i++)scanf("%lld",&a[i]);for(ll i=2,j=0;i<=n;i++){while(j&&a[j+1]!=a[i])j=nxt[j];j+=(a[j+1]==a[i]);nxt[i]=j;}for(ll i=n;i;i=nxt[i])(ans+=pw[i])%=P;printf("%04lld\n",ans);}return 0; }

總結

以上是生活随笔為你收集整理的P4548-[CTSC2006]歌唱王国【概率生成函数,KMP】的全部內容,希望文章能夠幫你解決所遇到的問題。

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