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

1|0正题

题目链接:https://www.luogu.com.cn/problem/P4548


1|1题目大意

t次询问,给出一个长度为m的串S和一个空串T,每次在T后面随机加入1n的字符,直到T中出现S为止,求期望次数。

1n105,t50,1m105


1|2解题思路

对于一个随机的数字X,它的概率生成函数是一个形如

F(x)=i=0P(X=i)xi

F(x)=i=1P(X=i)ixi1

不难发现数字X的期望值就是E(X)=F(1)
然后还有一个不知道有啥用的X的方差(大概就是离散程度)

V(X)=F(1)+F(1)F(1)2

这题的话,设两个生成函数,F(x)表示停止时间X的概率生成函数,还有一个G(x)表示没有停止时间的概率(不是概率生成函数),具体地

G(x)=i=0P(i<X)xi

然后我们就有两个式子

xG(x)+1=F(x)+G(x)

这个式子的含义很好理解,在还没有结束的序列后面加入一个字符要么结束了要么没结束。

(xn)mG(x)=i=1m(xn)mibiF(x)

bi表示i是否是串S的一个border,这个式子的意思就是说在直接在未结束的T后面插入一个S,此时可能提前结束。

然后这两个式子怎么用呢,我们对第一个式子求导就有

G(x)+G(x)=F(x)+G(x)F(x)=G(x)

也就是说我们要求的E(X)=F(1)=G(1)
然后直接带入第二个式子,因为有F(1)=1,所以

(1n)mG(1)=i=1m(1n)mibiF(1)

G(1)=i=1mnibi

KMP求出b数组即可。

时间复杂度O(Tm)


1|3code

#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; }

__EOF__

本文作者QuantAsk
本文链接https://www.cnblogs.com/QuantAsk/p/15299271.html
关于博主:退役OIer,GD划水选手
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角推荐一下。您的鼓励是博主的最大动力!
posted @   QuantAsk  阅读(50)  评论(0编辑  收藏  举报
编辑推荐:
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 张高兴的大模型开发实战:(一)使用 Selenium 进行网页爬虫
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
点击右上角即可分享
微信分享提示