洛谷题面传送门

PGF 入门好题。

首先介绍一下 PGF 的基本概念。对于随机变量 \(X\),满足 \(X\) 的取值总是非负整数,我们即 \(P(v)\) 表示 \(X=v\) 的概率,那么我们定义 \(X\) 的概率生成函数为 \(F(x)=\sum\limits_{n\ge 0}P(n)x^n\)。较一般的生成函数有所不同的是,对于概率生成函数 \(F(1)=1\) 必然成立,因为 \(X\) 取遍所有值的概率之和为 \(1\)。此外,\(X\) 的期望 \(E(X)\) 也可表示为 \(\sum\limits_{n\ge 0}P(n)·n=F'(1)\),同理 \(X\) 的方差 variant 也可被表示为 \(F''(1)+F'(1)-F'(1)^2\),这个可以由方差基本公式 \(E(X^2)-E(X)^2\) 推得。

接下来考虑这道题。我们设 \(P(x)\) 为刚好唱了 \(x\) 秒的概率,\(Q(x)\) 为唱了至少 \(x+1\) 秒的概率,再记 \(F(x),G(x)\) 分别为 \(P(x),Q(x)\) 的 PGF,那么考虑 \(F,G\) 之间有什么联系,首先:

\[P(x)+Q(x)=P(x-1)(x\ge 1)
\]

这是因为至少唱 \(x\) 秒的概率就是恰好 \(x\) 秒的概率加上至少 \(x+1\) 秒的概率。

写成 PGF 的形式就是

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

我们再从酋长的名字 \(a\) 的角度列式子。我们考虑一个时刻 \(t\),如果唱了 \(t\) 秒后还没有唱出酋长的名字,并且在接下来 \(len\) 秒后刚好唱出了酋长的名字,那么这样的概率就是 \(Q(x)·\dfrac{1}{n^{len}}\),再考虑将这个概率表示成 \(P\) 的形式,我们考虑什么时第一次唱出酋长的名字,我们假设在时刻 \(t+t'\),显然 \(t'\in[1,len]\),那么这样的概率就是 \(P(t+t')·\dfrac{1}{n^{len-t'}}\),但是一个 \(t'\) 不一定符合条件。不难发现由于我们钦定 \([t+1,t+len]\) 唱出的部分刚好是酋长的名字,而由于我们钦定 \(t+t'\) 时刻刚好唱出酋长的名字,因此必须有 \(a_i=a_{t-t'+i}\),也就是 \(a\) 存在长度为 \(t'\) 的 border。如果我们设 \(b_i\) 表示 \(a\) 是否存在长度 \(i\) 的 border,那么

\[Q(x)·\dfrac{1}{n^{len}}=\sum\limits_{t'=1}^{len}b_{t'}·P(t+t')·\dfrac{1}{n^{len-t'}}
\]

写成 PGF 的形式就是

\[G(x)·(\dfrac{1}{n}x)^{len}=\sum\limits_{t'=1}^{len}b_{t'}·F(x)·(\dfrac{1}{n}x)^{len-t'}
\]

考虑将两个式子结合起来。对记一个式子求导可得:

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

取 \(x=1\) 可得:

\[E(x)=F'(1)=G(1)
\]

也就是说答案等于 \(G(1)\)。

再将答案代入第二个式子:

\[G(1)·\dfrac{1}{n^{len}}=\sum\limits_{t'=1}^{len}b_{t'}·F(1)·\dfrac{1}{n^{len-t'}}
\]

再结合 \(F(1)=1\) 可得:

\[E(x)=\sum\limits_{i=1}^{len}b_i·n^{i}
\]

哈希/KMP 求 border 即可线性求解答案。

const int MAXN=1e5;
const int BS=333337;
const int HMOD=1004535809;
const int MOD=10000;
void print(int x){
static int d[6];int len=0;
while(x) d[len++]=x%10,x/=10;
while(len<4) d[len++]=0;
for(int i=3;~i;i--) printf("%d",d[i]);
printf("\n");
}
int n,qu,len,a[MAXN+5],pre[MAXN+5],suf[MAXN+5],pw[MAXN+5],pwn[MAXN+5];
void solve(){
scanf("%d",&len);for(int i=1;i<=len;i++) scanf("%d",&a[i]);
for(int i=1;i<=len;i++) pre[i]=(pre[i-1]+1ll*a[i]*pw[i-1])%HMOD;
suf[len+1]=0;for(int i=len;i;i--) suf[i]=(1ll*suf[i+1]*BS+a[i])%HMOD;
int res=0;for(int i=1;i<=len;i++) if(pre[i]==suf[len-i+1]) res=(res+pwn[i])%MOD;
print(res);
}
int main(){
int qu;scanf("%d%d",&n,&qu);
for(int i=(pwn[0]=1);i<=MAXN;i++) pwn[i]=1ll*pwn[i-1]*n%MOD;
for(int i=(pw[0]=1);i<=MAXN;i++) pw[i]=1ll*pw[i-1]*BS%HMOD;
while(qu--) solve();
return 0;
}

洛谷 P4548 - [CTSC2006]歌唱王国(概率生成函数)的更多相关文章

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

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

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

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

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

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

  4. luogu P4548 [CTSC2006]歌唱王国

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

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

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

  6. [CTSC2006]歌唱王国

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

  7. bzoi1152 [CTSC2006]歌唱王国Singleland

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

  8. 洛谷P4389 付公主的背包--生成函数+多项式

    题目链接戳这里 题目描述 有\(n\)件不同的商品,每件物品都有无限个,输出总体积为\([1,m]\)的方案数 思路 直接跑背包有\(30\) 考虑把每个物品的生成函数设出来,对于一件体积为\(v\) ...

  9. 洛谷P4389 付公主的背包 [生成函数,NTT]

    传送门 同样是回过头来发现不会做了,要加深一下记忆. 思路 只要听说过生成函数的人相信第一眼都可以想到生成函数. 所以我们要求 \[ ans=\prod \sum_n x^{nV}=\prod \fr ...

随机推荐

  1. 【转载】如何从零开始开发一款嵌入式产品(20年的嵌入式经验分享学习,来自STM32神舟系列开发板设计师的总结

    [好文章值得分享,摘自作者:jesse] 来源:www.armjishu.com作者:jesse转载请注明出处 我的另一篇文章:<STM32嵌入式入门必看之文章-----介绍非常详细!(学STM ...

  2. tcl概述

    tcl,全名tool command language,是一种通用的工具语言. 1)每个命令之间,通过换行符或者分号隔开: 2)tcl的每个命令包含一个或者多个单词,默认第一个单词表示命令,第二个单词 ...

  3. 耗时一个月,整理出这份Hadoop吐血宝典

    本文目录: 一.HDFS 二.MapReduce 三.Yarn 四.Hadoop3.x 新特性 五.Hadoop 大厂面试真题解析 Hadoop 涉及的知识点如下图所示,本文将逐一讲解: 本文档参考了 ...

  4. 【UE4 设计模式】享元模式 Flyweight Pattern

    概述 描述 运用共享技术有效地支持大量细粒度对象的复用.系统只使用少量的对象,而这些对象都很相似,状态变化很小,可以实现对象的多次复用. 由于享元模式要求能够共享的对象必须是细粒度对象,因此它又称为轻 ...

  5. Java 是编译型语言还是解释型语言?

    Java首先由编译器编译成.class类型的文件,这个是java自己类型的文件.然后在通过虚拟机(JVM)从.class文件中读一行解释执行一行.因此Java是一种半编译半解释的语言,理解这种意思即可 ...

  6. 记一个非常诡异的关于 shared_ptr 的 bug

    问题描述 今天写项目的时候遇见一个特别诡异的 bug,体现在在执行某条语句时,程序会莫名崩溃,并且给出的错误信息也非常难懂,只有一个malloc(): invalid size (unsorted)错 ...

  7. Spring 5 MVC 中的 Router Function 使用

    Spring 5 发行已经好几年了,里面提出了好几个新点子.其中一个就是 RouterFunction,这是个什么东西呢? Spring框架给我们提供了两种http端点暴露方式来隐藏servlet原理 ...

  8. 【二食堂】Beta - Scrum Meeting 8

    Scrum Meeting 8 例会时间:5.22 20:00~20:10 进度情况 组员 当前进度 今日任务 李健 1. UI优化已经完成,顺带修复了一点小bug.issue 1. 文本导入.保存部 ...

  9. BF算法和KMP算法

    这两天复习数据结构(严蔚敏版),记录第四章串中的两个重要算法,BF算法和KMP算法,博主主要学习Java,所以分析采用Java语言,后面会补上C语言的实现过程. 1.Brute-Force算法(暴力法 ...

  10. 洛谷 P4555 [国家集训队]最长双回文串

    链接: P4555 题意: 在字符串 \(S\) 中找出两个相邻非空回文串,并使它们长度之和最大. 分析: 直接使用马拉车算法求出每个点扩展的回文串.如果枚举两个回文串显然会超时,我们考虑切割一个长串 ...