BZOJ 1152 歌唱王国
题目传送门
分析:
这道题很神仙,我们给出低配版解法和高配版解法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 歌唱王国的更多相关文章
- 【BZOJ1152】歌唱王国(生成函数,KMP)
[BZOJ1152]歌唱王国(生成函数,KMP) 题面 BZOJ 洛谷 题解 根据\(YMD\)论文来的QwQ. 首先大家都知道普通型生成函数是\(\displaystyle \sum_{i=0}^{ ...
- [CTSC2006]歌唱王国
[CTSC2006]歌唱王国 Tags:题解 题意 链接:在空串后不断随机添加字符,直到出现串\(S_i\)为止.求最终串的期望长度.\(\sum |S_i|\le 5*10^6\) 题解 以下内容来 ...
- bzoj 2850 巧克力王国
bzoj 2850 巧克力王国 钱限题.题面可以看这里. 显然 \(x\) \(y\) 可以看成坐标平面上的两维,蛋糕可以在坐标平面上表示为 \((x,y)\) ,权值为 \(h\) .用 \(kd- ...
- bzoi1152 [CTSC2006]歌唱王国Singleland
[CTSC2006]歌唱王国Singleland Time Limit: 30 Sec Memory Limit: 162 MB Description 在歌唱王国,所有人的名字都是一个非空的仅包含整 ...
- 【题解】歌唱王国(概率生成函数+KMP)+伦讲的求方差
[题解]歌唱王国(概率生成函数+KMP)+伦讲的求方差 生成函数的本质是什么呀!为什么和It-st一样神 设\(f_i\)表示填了\(i\)个时候停下来的概率,\(g_i\)是填了\(i\)个的时候不 ...
- 【BZOJ】1152: [CTSC2006]歌唱王国Singleland
题解 读错题了,是最后留下一个牛人首长歌颂他,和其他人没有关系,t就相当于数据组数 结论题,具体可看 https://www.zhihu.com/question/59895916/answer/19 ...
- BZOJ 2850: 巧克力王国 KDtree + 估价函数
Code: #include<bits/stdc++.h> #define maxn 100000 #define inf 1000000008 #define mid ((l+r)> ...
- 解题:CTSC 2006 歌唱王国
题面 概率生成函数 对于菜鸡博主来说好难啊 其一般形式为$F(x)=\sum\limits_{i=0}^∞[x==i]x_i$,第i项的系数表示离散变量x取值为i的概率 一般的两个性质:$F(1)=1 ...
- 洛谷P4548 [CTSC2006]歌唱王国(概率生成函数)
题面 传送门 给定一个长度为\(L\)的序列\(A\).然后每次掷一个标有\(1\)到\(m\)的公平骰子并将其上的数字加入到初始为空的序列\(B\)的末尾,如果序列B中已经出现了给定序列\(A\), ...
随机推荐
- 计算机网络OSI模型
一. 理想模型-OSI 7层模型 那么数据是如何传输的呢?看下图:上层的Header+DATA作为新的Data再次被封装,到达目的地后就像剥洋葱一样掐头(去尾)最终留下你所要传的数据. 各层功能详细阐 ...
- Java中大量if...else语句的消除替代方案
在我们平时的开发过程中,经常可能会出现大量If else的场景,代码显的很臃肿,非常不优雅.那我们又没有办法处理呢? 针对大量的if嵌套让代码的复杂性增高而且难以维护.本文将介绍多种解决方案. 案例 ...
- 经典问题(c++/python)素数、杨辉三角(金字塔型)、统计单词数、简单计算器、密码安全程度、凯撒密码加密、汉诺塔 (python课设实验实例)-- biaobiao88
[编写程序,输人一个大于2的自然数,然后输出小于该数字的所有素数组成的列表.]所谓素数,是指除了1和自身之外没有其他因数的自然数,最小的素数是2,后面依次是3.5.7.11.13... c++代码: ...
- $Poj3208$ 启示录 数位统计$DP$
Poj AcWing Description Sol 这题长得就比较像数位$DP$叭. 所以先用$DP$进行预处理,再基于拼凑思想,通过"试填法"求出最终的答案. 设$F[i] ...
- 大白话抽象工厂模式(Abstract Factory Pattern)
实例分析 大白话工厂方法模式(Factory Method)一文中,我们讲解了日产4S店工厂规模的扩大,创建了针对不同车型的工厂,减少了工厂的工作内容,提高了效率.下面我们继续以4S店的故事讨论抽象工 ...
- day3(if和for)
if if <条件判断 1>: <执行 1>elif <条件判断 2>: <执行 2>elif <条件判断 3>: <执行 3> ...
- ENS使用指南系列之一 [ 注册 .eth 域名详细教程 ]
ENS 域名系统中目前支持三种顶级域名,分别是 .eth .xyz .luxe.其中, .eth 是 ENS 系统的原生域名,是由一系列智能合约控制的去中心化的域名,另外两种是从互联网域名中接入的,要 ...
- JavaScript-EventLoop-事件循环
2020-01-11 EventLoop-事件循环 一.学习事件循环之前,先学习几个英语词组 EventLoop 事件循环 Event Queue 事件队列 Event Table 事件表macro- ...
- Centos 中文乱码解决方法
问题描述 crontab -e 添加定时任务时,直接将下面内容粘贴过去,结果竟然乱码了. # 每个星期日凌晨3:00执行完全备份脚本 0 3 * * 0 /bin/bash -x /root/bash ...
- vue设置选中时的样式名称
第一种方式:在router中全局设置 export default new Router({ mode:'history', linkActiveClass:'index', routes: [ { ...