正题

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


题目大意

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

\(1\leq n\leq 10^5,t\leq 50,1\leq m\leq 10^5\)


解题思路

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

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

不难发现数字\(X\)的期望值就是\(E(X)=F'(1)\)

然后还有一个不知道有啥用的\(X\)的方差(大概就是离散程度)

\[V(X)=F''(1)+F'(1)-F'(1)^2
\]

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

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

然后我们就有两个式子

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

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

\[\left(\frac{x}{n}\right)^mG(x)=\sum_{i=1}^m \left(\frac{x}{n}\right)^{m-i}b_iF(x)
\]

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

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

\[G(x)+G'(x)=F'(x)+G'(x)\Rightarrow F'(x)=G(x)
\]

也就是说我们要求的\(E(X)=F'(1)=G(1)\)

然后直接带入第二个式子,因为有\(F(1)=1\),所以

\[\left(\frac{1}{n}\right)^mG(1)=\sum_{i=1}^m \left(\frac{1}{n}\right)^{m-i}b_iF(1)
\]
\[\Rightarrow G(1)=\sum_{i=1}^mn^ib_i
\]

用\(KMP\)求出\(b\)数组即可。

时间复杂度\(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】的更多相关文章

  1. 【题解】歌唱王国(概率生成函数+KMP)+伦讲的求方差

    [题解]歌唱王国(概率生成函数+KMP)+伦讲的求方差 生成函数的本质是什么呀!为什么和It-st一样神 设\(f_i\)表示填了\(i\)个时候停下来的概率,\(g_i\)是填了\(i\)个的时候不 ...

  2. Luogu4548 CTSC2006 歌唱王国 概率生成函数、哈希

    传送门 orz ymd 考虑构造生成函数:设\(F(x) = \sum\limits_{i=0}^\infty f_ix^i\),其中\(f_i\)表示答案为\(i\)的概率:又设\(G(x) = \ ...

  3. 洛谷P4548 [CTSC2006]歌唱王国(概率生成函数)

    题面 传送门 给定一个长度为\(L\)的序列\(A\).然后每次掷一个标有\(1\)到\(m\)的公平骰子并将其上的数字加入到初始为空的序列\(B\)的末尾,如果序列B中已经出现了给定序列\(A\), ...

  4. 洛谷 P4548 - [CTSC2006]歌唱王国(概率生成函数)

    洛谷题面传送门 PGF 入门好题. 首先介绍一下 PGF 的基本概念.对于随机变量 \(X\),满足 \(X\) 的取值总是非负整数,我们即 \(P(v)\) 表示 \(X=v\) 的概率,那么我们定 ...

  5. luogu P4548 [CTSC2006]歌唱王国

    传送门 这题\(\mathrm{YMD}\)去年就讲了,然而我今年才做(捂脸) 考虑生成函数,设\(f_i\)表示最终串长为\(i\)的概率,其概率生成函数为\(F(x)=\sum f_ix^i\), ...

  6. 【BZOJ1152】歌唱王国(生成函数,KMP)

    [BZOJ1152]歌唱王国(生成函数,KMP) 题面 BZOJ 洛谷 题解 根据\(YMD\)论文来的QwQ. 首先大家都知道普通型生成函数是\(\displaystyle \sum_{i=0}^{ ...

  7. [CTSC2006]歌唱王国

    [CTSC2006]歌唱王国 Tags:题解 题意 链接:在空串后不断随机添加字符,直到出现串\(S_i\)为止.求最终串的期望长度.\(\sum |S_i|\le 5*10^6\) 题解 以下内容来 ...

  8. bzoi1152 [CTSC2006]歌唱王国Singleland

    [CTSC2006]歌唱王国Singleland Time Limit: 30 Sec Memory Limit: 162 MB Description 在歌唱王国,所有人的名字都是一个非空的仅包含整 ...

  9. 题解 [CTSC2006]歌唱王国

    题目传送门 Desctiption 见题面. Solution 人类智慧... 考虑这样一个赌博游戏,现在有一个猴子,它随机从 \(1\sim n\) 中选一个打出来.现在有若干个赌徒,他们一开始都有 ...

随机推荐

  1. mysql 优化面试题

    第一方面:30种mysql优化sql语句查询的方法 1.对查询进行优化,应尽量避免全表扫描,首先应考虑在 where 及 order by涉及的列上建立索引. 2.应尽量避免在 where 子句中使用 ...

  2. POI实现excel的导入导出

    引入依赖 <dependency> <groupId>org.apache.poi</groupId> <artifactId>poi</arti ...

  3. springcloud<zuul过滤器简单配置与跨域设置>

    package com.wangbiao.config; import com.netflix.zuul.ZuulFilter; import com.netflix.zuul.context.Req ...

  4. PC微信多开

    1.桌面上面新建一个  多开.txt . 2.将下面的内容拷贝进去 TASKKILL /F /IM wechat.exestart "" "E:\wechat\WeCha ...

  5. 自定义Listener

    前言 为什么要自定义Listener? 通过自定义,可以在程序启动过程中监听特定事件,再回调处理逻辑. 自定义SpringApplicationRunListener 1.创建自定义SpringApp ...

  6. Linux常用命令(二)之权限管理、文件搜索、帮助、压缩命令及管道

    在(一)中提到过rwx的含义,但是我们还需深入理解,明白其真正的含义和权限,对于文件和目录,rwx权限是不同的,尤其是目录的权限往往是被忽略的: 对于目录,其权限和对应的操作: r-ls w-touc ...

  7. kubernetes使用jenkins Pipeline 部署Nginx

    文章原文 环境需求 kubernetes 未安装参考使用kubeadm安装kubernetes 1.21 jenkins github/gitee/gitlab 静态页面 镜像仓库(我使用的 hub. ...

  8. samba网络共享

    1.sanma简介 2. samba安装 #更新源 opkg update #搜索软件包,查看版本 opkg list | grep "samba" #根据查询的版本安装服务器和l ...

  9. uboot命令简介

    uboot下的命令行 1.典型嵌入式linux系统启动过程: 嵌入式系统上电后先执行uboot.然后uboot负责初始化DDR,初始化Flash,然后将OS从Flash中读取到DDR中,然后启动OS( ...

  10. Input 只能输入数字,数字和字母等的正则表达式

    JS只能输入数字,数字和字母等的正则表达式 1.文本框只能输入数字代码(小数点也不能输入) <input onkeyup="this.value=this.value.replace( ...