题目传送门

分析:

这道题很神仙,我们给出低配版解法和高配版解法2333

低配版:

首先知道这样一个公式。。。(证明去高配版)

当一个字符串S其中S [ 1 , i ] = S [ n - i + 1 , n ]时,则称S [ 1 , i ]为S的一个border

Ans[n]=sigma( S [ 1, i ]为S的border) m ^ i

嗯。。。

有了这个之后,我们就可以kmp或者hash求解了

但是,hash只能处理取到S的答案,而kmp可以做到处理出所有S前缀的答案

这里就用kmp(相信hash很简单(大雾))

那么我们设 f [ i ] 为递推到第 i 位的答案

我们先处理出fail数组

那么S[ 1 , i ]的border的集合就是S[ 1 , i ]本身加上S[ 1 , fail [ i ] ]的border集合

所以得出递推式

f [ i ] = f [ fail [ i ] ] + m ^ i

算到 n 就是答案了

高配版:

首先我们要知道生成函数的表达式:

F(i) = sigma( i = 0...+∞) Ai * x ^ i

我们从生成函数定义概率生成函数,其中代价为 i 的事件发生的概率为 Ai:

那么我们可以知道:

F(1) = 1

相当于x取1时,F(1)代表的是所有情况的概率和,其值为1是显然正确的,就是事件本身

然后我们考虑期望代价E(x)

E(x) = sigma( i = 0...+∞)Ai * i

因为当 i 为0时不做贡献,所以 i 可以从1开始

接下来有一个有趣的事情,我们把F(x)求导

F'(x)=sigma( i =1...+∞)Ai * i * x ^ ( i - 1 )

我们再取F'(1) = sigma( i = 1...+∞)Ai * i

与E(x)做一下比较,我们惊奇地发现:

E(x) = F'(1)

这是巧合吗?还是冥冥之中的必然?

这也说明了,概率和期望是有必然的联系的

于是我们进入正题

设函数F(x)表示结束时长度为 i 的概率,G(x)表示长度到了 i 还没有结束的概率

那么我们得到这个等式:

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

分为每一位考虑,其实就是整个递推的过程,你在i - 1位没有结束的概率,就是你在 i 位结束和在 i 位没结束的概率和

这个式子记为1式

然后我们考虑求解。。。

我们往G(x)上强行加 (1/m x)^n 这个串一定会结束,然而这个串可能提前结束,因为之前的串里可能有S的border

我们枚举border的长度

首先定义ai=0或1 代表S[ 1 , i ]是否为S的border

于是可以得到这个式子。。。

G(x) * ( 1/m * x) ^ n = sigma(i=1...n) ai * F(x) * (1/m * x) ^ ( n - i )

不好说这个式子,但感(hu)性(luan)分析一下挺正确的2333

这只Darknesses笨笨的,讲不清楚

把这个式子记为2式

然后我们大♂力推式子

首先对1式求导

F'(x) + G'(x) = G(x) + G'(x) * x

要求F'(1)诶。。。

直接取吧2333

然后惊奇地发现

F'(1)=G(1)

第二个再取1试试

G(1) * (1/m) ^ n = sigma(i=1...n) ai * F(1) * (1/m) ^ ( n - i )

因为F(1)=1,我们再把(1/m) ^ n除过去

G(1)=sigma(i=1...n) ai * m ^ i

所以Ans[n]=E(x)=F'(1)=G(1)=sigma( S[ 1 , i ]为S的border ) m^i

得证了。。。

呵呵呵。。。

生成函数真神仙。。。

数学太菜了2333

#include<cstdio>
#include<algorithm>
#include<vector>
#include<cmath>
#include<cstring>
#include<string>
#include<map>
#include<queue>
#include<iostream> #define maxn 1000005
#define MOD 1000000007 using namespace std; inline int getint()
{
int num=,flag=;char c;
while((c=getchar())<''||c>'')if(c=='-')flag=-;
while(c>=''&&c<='')num=num*+c-,c=getchar();
return num*flag;
} int n,m;
long long a[maxn],pw[maxn];
long long ans;
long long fail[maxn],f[maxn]; int main()
{
m=getint(),n=getint(),f[]=;
for(int i=;i<=n;i++)a[i]=getint(),f[i]=f[i-]*m%MOD;
fail[]=-;
for(int i=;i<=n;i++)
{
for(int j=fail[i-];j>=;j=fail[j])
if(a[i]==a[j+]){fail[i]=j+,(f[i]+=f[j+])%=MOD;break;}
}
for(int i=;i<=n;i++)printf("%lld\n",f[i]);
}

代码不能直接AC哦,它输出的式S所有前缀的答案2333

代码短,证明还真长呢2333

BZOJ 1152 歌唱王国的更多相关文章

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

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

  2. [CTSC2006]歌唱王国

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

  3. bzoj 2850 巧克力王国

    bzoj 2850 巧克力王国 钱限题.题面可以看这里. 显然 \(x\) \(y\) 可以看成坐标平面上的两维,蛋糕可以在坐标平面上表示为 \((x,y)\) ,权值为 \(h\) .用 \(kd- ...

  4. bzoi1152 [CTSC2006]歌唱王国Singleland

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

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

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

  6. 【BZOJ】1152: [CTSC2006]歌唱王国Singleland

    题解 读错题了,是最后留下一个牛人首长歌颂他,和其他人没有关系,t就相当于数据组数 结论题,具体可看 https://www.zhihu.com/question/59895916/answer/19 ...

  7. BZOJ 2850: 巧克力王国 KDtree + 估价函数

    Code: #include<bits/stdc++.h> #define maxn 100000 #define inf 1000000008 #define mid ((l+r)> ...

  8. 解题:CTSC 2006 歌唱王国

    题面 概率生成函数 对于菜鸡博主来说好难啊 其一般形式为$F(x)=\sum\limits_{i=0}^∞[x==i]x_i$,第i项的系数表示离散变量x取值为i的概率 一般的两个性质:$F(1)=1 ...

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

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

随机推荐

  1. 2018-8-14-resharper-自定义代码片

    title author date CreateTime categories resharper 自定义代码片 lindexi 2018-08-14 17:34:51 +0800 2018-2-13 ...

  2. Tomcat 类加载器打破双亲委派模型

    我们分为4个部分来探讨: 1. 什么是类加载机制? 2. 什么是双亲委任模型? 3. 如何破坏双亲委任模型? 4. Tomcat 的类加载器是怎么设计的? 我想,在研究tomcat 类加载之前,我们复 ...

  3. 简易数据分析 15 | Web Scraper 高级用法——CSS 选择器的使用

    这是简易数据分析系列的第 15 篇文章. 年末事情比较忙,很久不更新了,后台一直有读者催更,我看了一些读者给我的私信,发现一些通用的问题,所以单独写篇文章,介绍一些 Web Scraper 的进阶用法 ...

  4. 微信小程序map地图的一些使用注意事项

    1.小程序组件map,在微信7.0.4以上(不包括7.0.4)层级问题官方已作更新,可在map上随意添加任何标签使用z-index即可:微信7.0.4版本以下map组件层级默认是最高的,只能使用官方提 ...

  5. __str__、__repr__和__format__

    obj.__ str __ ()是面向用户的,该方法将实例转换为一个字符 obj.__ repr __ ()面向程序员,该方法返回一个实例的代码表示形式,通常用来重新构造这个实例,repr()函数返回 ...

  6. Python学习3月8号【python编程 从入门到实践】---》笔记(1)

    第十章:处理文件和异常 #学习处理文件,让程序能够快速地分析大量的数据#学习错误处理,避免程序在面对意外情形时崩溃#学习异常,是python创建的特殊对象,用于管理程序运行时出现#学习模块json,它 ...

  7. $CF888G\ Xor-MST$ 最小生成树

    正解:最小生成树 解题报告: 传送门$QwQ$ 发现$Kruskal$和$Prime$都不太可做,于是考虑$B$算法. 先大概港下$B$算法的流程趴$QwQ$.大概就,每次对每个联通块找到最近的联通块 ...

  8. 洛谷$P5446\ [THUPC2018]$绿绿和串串 $manacher$

    正解:$manacher$ 解题报告: 传送门$QwQ$ 考虑这个操作的实质是啥$QwQ$?其实就,变成以最后一个节点为回文中心的回文子串嘛$QwQ$.显然就先跑个马拉车再说呗$QwQ$. 然后接着考 ...

  9. 洛谷$P2605\ [ZJOI2010]$基站选址 线段树优化$dp$

    正解:线段树优化$dp$ 解题报告: 传送门$QwQ$ 难受阿,,,本来想做考试题的,我还造了个精妙无比的题面,然后今天讲$dp$的时候被讲到了$kk$ 先考虑暴力$dp$?就设$f_{i,j}$表示 ...

  10. 博帝飚速盘 16G

    设备制造商:  Patriot Memory当前协议  :  USB2.0输入电流  :  300mA 芯片制造商:  群联(Phison)芯片型号  :  PS2251-38闪存颗粒  :  美光( ...