Ybt#452-序列合并【期望dp】
正题
题目链接:https://www.ybtoj.com.cn/contest/113/problem/2
题目大意
一个空序列,每次往末尾加入一个\([1,m]\)中的随机一个数。如果末尾两个数相同都为\(x\)且\((x<t)\),那么将它们合并成\(x+1\)。
如果序列长度为\(n\)且无法合并则结束,求序列期望和。
\(n,m\in[1,10^3],t\in[1,10^9]\)
解题思路
首先显然地\(t=min\{n+m-1,t\}\)。
之后考虑序列中的每一个位置可能的数,因为每种情况都有可能,所以我们需要算概率先,设\(p_{i,j}\)表示剩余\(i\)个位置时出现\(j\)的概率,那么有\(p_{i,j}=\frac1m\times [j\leq m]+p_{i,j-1}^2\)(直接出现或者合并出来)。
设\(p_{i,j}\times q_{i,j}\)表示剩下\(i\)个位置且第一个最终是\(j\)的概率,那么有\(q_{i,j}=1-p_{i-1,j}\times [j<t]\)(\(q_{i,j}\)就表示在出现了\(j\)的前提下不变的概率,减去会变的概率就好了)。
但是因为每个位置的概率不是独立的,所以不能直接用这个来算答案。
设\(p_{i,j}\times g_{i,j}\)表示在剩下\(i\)个位置且第一个最终是\(j\)时和的期望和(注意期望=概率*次数),\(p_{i,j}\times f_{i,j}\)表示剩下\(i\)个位置时第一个出现过\(j\)的情况的期望和,\(ans_i\)表示剩下\(i\)个位置时的期望和。
那么有
\]
考虑\(g\)的递推式有
\]
(有\(q_{i,j}\)的概率最终是\(j\),填完剩下的,且下一个不能出现\(j\))
考虑\(f\)的递推式有
\]
(第一种是最终不变,第二种是变成了\(j+1\)的情况)
这样就可以递推了,时间复杂度\(O(n^2)\)
code
#include<cstdio>
#include<cstring>
#include<algorithm>
#define ll long long
using namespace std;
const ll N=2100,P=1e9+7;
ll n,m,t,p[N][N],q[N][N],g[N][N],f[N][N],ans[N];
ll power(ll x,ll b){
ll ans=1;
while(b){
if(b&1)ans=ans*x%P;
x=x*x%P;b>>=1;
}
return ans;
}
signed main()
{
freopen("sequence.in","r",stdin);
freopen("sequence.out","w",stdout);
scanf("%lld%lld%lld",&n,&m,&t);
ll inv=power(m,P-2);
t=min(t,n+m-1);
for(ll i=1;i<=n;i++)
for(ll j=1;j<=t;j++){
p[i][j]=(inv*(j<=m)+p[i-1][j-1]*p[i][j-1]%P)%P;
q[i][j]=(1-(j<t)*p[i-1][j]+P)%P;
}
for(ll i=1;i<=n;i++){
for(ll j=t;j>=1;j--){
if(j!=t)
g[i][j]=(q[i][j]*j%P+ans[i-1]-f[i-1][j]*p[i-1][j]%P+P)%P;
else
g[i][j]=(q[i][j]*j%P+ans[i-1])%P;
f[i][j]=(g[i][j]%P+(1-q[i][j])*f[i][j+1]%P)%P;
(ans[i]+=g[i][j]*p[i][j])%=P;
}
}
printf("%lld\n",ans[n]);
return 0;
}
Ybt#452-序列合并【期望dp】的更多相关文章
- loj6171/bzoj4899 记忆的轮廊(期望dp+优化)
题目: https://loj.ac/problem/6171 分析: 设dp[i][j]表示从第i个点出发(正确节点),还可以有j个存档点(在i点使用一个存档机会),走到终点n的期望步数 那么 a[ ...
- 概率期望dp
对于概率dp,我一直都弄得不是特别明白,虽然以前也有为了考试去突击过,但是终究还是掌握得不是很好,所以决定再去学习一遍,把重要的东西记录下来. 1.hdu4405 Description 在一个 \( ...
- 【BZOJ】4318: OSU! 期望DP
[题意]有一个长度为n的01序列,每一段极大的连续1的价值是L^3(长度L).现在给定n个实数表示该位为1的概率,求期望总价值.n<=10^5. [算法]期望DP [题解]后缀长度是一个很关键的 ...
- 【poj2096】Collecting Bugs 期望dp
题目描述 Ivan is fond of collecting. Unlike other people who collect post stamps, coins or other materia ...
- hdu4418 Time travel 【期望dp + 高斯消元】
题目链接 BZOJ4418 题解 题意:从一个序列上某一点开始沿一个方向走,走到头返回,每次走的步长各有概率,问走到一点的期望步数,或者无解 我们先将序列倍长形成循环序列,\(n = (N - 1) ...
- 【期望dp 质因数分解】cf1139D. Steps to One
有一种组合方向的考虑有没有dalao肯高抬啊? 题目大意 有一个初始为空的数组$a$,按照以下的流程进行操作: 在$1\cdots m$中等概率选出一个数$x$并添加到$a$的末尾 如果$a$中所有元 ...
- Codeforces 1139D(期望dp)
题意是模拟一个循环,一开始有一个空序列,之后每次循环: 1.从1到m中随机选出一个数字添加进去,每个数字被选的概率相同. 2.检查这个序列的gcd是否为1,如果为1则停止,若否则重复1操作直至gcd为 ...
- 概率及期望DP小结
资源分享 26 个比较概率大小的问题 数论小白都能看懂的数学期望讲解 概念 \(PS\):不需要知道太多概念,能拿来用就行了. 定义 样本(\(\omega\)):一次随机试验产生的一个结果. 样本空 ...
- Gym - 101190F Foreign Postcards (期望dp)
题意:有n张标有“C”或“F”的卡片. 1.随机取前k张(1<=k<=n) 2.若这k张的第一张为“C”,则不翻转,否则,全部翻转这k张. 3.然后处理剩下的n-k张 4.重复步骤1~3直 ...
- 【算法学习笔记】概率与期望DP
本文学习自 Sengxian 学长的博客 之前也在CF上写了一些概率DP的题并做过总结 建议阅读完本文再去接着阅读这篇文章:Here 前言 单纯只用到概率的题并不是很多,从现有的 OI/ACM 比赛中 ...
随机推荐
- 源码安装nginx开启SSL功能
编译安装nginx的环境 yum -y install gcc zlib zlib-devel pcre-devel openssl openssl-devel 下载nginx安装包 cd /usr/ ...
- [ES6深度解析]14:子类 Subclassing
我们描述了ES6中添加的新类系统,用于处理创建对象构造函数的琐碎情况.我们展示了如何使用它来编写如下代码: class Circle { constructor(radius) { this.radi ...
- C++程序调试方式总结
bug调试要根据应用场景和条件,选择什么样子的调试方式很大程度上不是你想选择什么样的调试方式,而是还剩下什么样子的调试方式可用.下面就根据不同的场景和条件来总结一下. 目录: 1.gdb调试或者IDE ...
- Spring详解------概述
1.什么是 Spring ? Spring是一个开源框架,Spring是于2003 年兴起的一个轻量级的Java 开发框架,由Rod Johnson 在其著作Expert One-On-One J2E ...
- BUUCTF-[极客大挑战 2019]BuyFlag
BUUCTF-[极客大挑战 2019]BuyFlag 进去一看,哦原来是某安全团队的招募启示. 但没看到什么有用的信息,看到了Q群号,我还以为是一道社工题(=_=) 来到pay.php 看一下源码,发 ...
- Git使用教程一
Git是一个分布式版本控制系统,简单的说其就是一个软件,用于记录一个或若 干文件内容变化,以便将来查阅特定版本修订情况的软件. Github (https://www.github.com) 是-一个 ...
- C#使用异步需要注意的几个问题
C#异步使用需要注意的几个问题1.异步方法如果只是对别的方法的简单的转发调用,没哟复杂的逻辑(比如等待A的结果,再调用B,等待A调用的返回值拿到内部做一些处理再返回),那么就可以去掉async关键字. ...
- java 多线程Thread和Runnable的区别
如果一个类继承Thread,则不适合资源共享.但是如果实现了Runable接口的话,则很容易的实现资源共享 实现Runnable接口比继承Thread类所具有的优势:1. 适合多个相同的程序代码的线程 ...
- springcloud3(五) spring cloud gateway动态路由的四类实现方式
写这篇博客主要是为了汇总下动态路由的多种实现方式,没有好坏之分,任何的方案都是依赖业务场景需求的,现在网上实现方式主要有: 基于Nacos, 基于数据库(PosgreSQL/Redis), 基于Mem ...
- 快速模式第二包: quick_inI1_ouR1()
文章目录 1. 序言 2. quick_inI1_outR1()流程图 3. 快速模式消息②数据包格式 4. 源码分析 4.1 quick_inI1_outR1() 4.2 quick_inI1_ou ...