正题

题目链接:https://www.ybtoj.com.cn/contest/113/problem/2


题目大意

一个空序列,每次往末尾加入一个[1,m][1,m][1,m]中的随机一个数。如果末尾两个数相同都为xxx且(x<t)(x<t)(x<t),那么将它们合并成x+1x+1x+1。

如果序列长度为nnn且无法合并则结束,求序列期望和。

n,m∈[1,103],t∈[1,109]n,m\in[1,10^3],t\in[1,10^9]n,m∈[1,103],t∈[1,109]


解题思路

首先显然地t=min{n+m−1,t}t=min\{n+m-1,t\}t=min{n+m−1,t}。

之后考虑序列中的每一个位置可能的数,因为每种情况都有可能,所以我们需要算概率先,设pi,jp_{i,j}pi,j​表示剩余iii个位置时出现jjj的概率,那么有pi,j=1m×[j≤m]+pi,j−12p_{i,j}=\frac1m\times [j\leq m]+p_{i,j-1}^2pi,j​=m1​×[j≤m]+pi,j−12​(直接出现或者合并出来)。

设pi,j×qi,jp_{i,j}\times q_{i,j}pi,j​×qi,j​表示剩下iii个位置且第一个最终是jjj的概率,那么有qi,j=1−pi−1,j×[j<t]q_{i,j}=1-p_{i-1,j}\times [j<t]qi,j​=1−pi−1,j​×[j<t](qi,jq_{i,j}qi,j​就表示在出现了jjj的前提下不变的概率,减去会变的概率就好了)。

但是因为每个位置的概率不是独立的,所以不能直接用这个来算答案。

设pi,j×gi,jp_{i,j}\times g_{i,j}pi,j​×gi,j​表示在剩下iii个位置且第一个最终是jjj时和的期望和(注意期望=概率*次数),pi,j×fi,jp_{i,j}\times f_{i,j}pi,j​×fi,j​表示剩下iii个位置时第一个出现过jjj的情况的期望和,ansians_iansi​表示剩下iii个位置时的期望和。

那么有
ansi=∑j=1tpi,j×gi,jans_i=\sum_{j=1}^{t}p_{i,j}\times g_{i,j}ansi​=j=1∑t​pi,j​×gi,j​

考虑ggg的递推式有
gi,j=qi,j×j+ansi−1−pi−1,j×fi−1,jg_{i,j}=q_{i,j}\times j+ans_{i-1}-p_{i-1,j}\times f_{i-1,j}gi,j​=qi,j​×j+ansi−1​−pi−1,j​×fi−1,j​
(有qi,jq_{i,j}qi,j​的概率最终是jjj,填完剩下的,且下一个不能出现jjj)
考虑fff的递推式有
fi,j=gi,j+(1−qi,j)fi,j+1f_{i,j}=g_{i,j}+(1-q_{i,j})f_{i,j+1}fi,j​=gi,j​+(1−qi,j​)fi,j+1​
(第一种是最终不变,第二种是变成了j+1j+1j+1的情况)

这样就可以递推了,时间复杂度O(n2)O(n^2)O(n2)


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;elseg[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】相关推荐

  1. 插头DP 概率DP / 期望DP

    插头DP && 概率DP / 期望DP 写在前面: 插头DP P5056 [模板]插头dp 手写哈希表的方法: 拉链法的代码如下: 开放寻址法的代码如下: 接下来是这道题的代码实现: ...

  2. 概率期望题(期望 DP)做题记录

    概率期望题(期望 DP)做题记录 P3830 [SHOI2012]随机树 难点在于第二问:生成树的期望深度. 不 wei zhuo 捏,设 \(dp_{i,j}\) 表示已经有了 \(i\) 个叶子结 ...

  3. 【poj2096】Collecting Bugs 期望dp

    题目描述 Ivan is fond of collecting. Unlike other people who collect post stamps, coins or other materia ...

  4. 【期望dp 质因数分解】cf1139D. Steps to One

    有一种组合方向的考虑有没有dalao肯高抬啊? 题目大意 有一个初始为空的数组$a$,按照以下的流程进行操作: 在$1\cdots m$中等概率选出一个数$x$并添加到$a$的末尾 如果$a$中所有元 ...

  5. luogu P4745 [CERC2017]Gambling Guide(期望DP + 最短路实现)

    整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 P4745 [CERC2017]Gambling Guide(期望DP + 最短路实现) Weblin ...

  6. 扩增子分析解读1质控,实验设计,双端序列合并

    写在前面 之前发布的<扩增子图表解读>系列,相信很多朋友都看过了(链接直达7月文章目录). 这些内容的初衷是写给刚进实验室的学生读,加速大家对同行文章的解读能力.如果连同行的结果都看不懂, ...

  7. [SCOI2008]奖励关(期望dp)

    你正在玩你最喜欢的电子游戏,并且刚刚进入一个奖励关.在这个奖励关里,系统将依次随机抛出k次宝物,每次你都可以选择吃或者不吃(必须在抛出下一个宝物之前做出选择,且现在决定不吃的宝物以后也不能再吃). 宝 ...

  8. 【bzoj4318】OSU! 期望dp

    题目描述 osu 是一款群众喜闻乐见的休闲软件.  我们可以把osu的规则简化与改编成以下的样子:  一共有n次操作,每次操作只有成功与失败之分,成功对应1,失败对应0,n次操作对应为1个长度为n的0 ...

  9. 【loj6342】跳一跳 期望dp

    题目描述 一个人从 $1$ 开始向 $n$ 跳,在 $i$ 时会等概率跳到 $i,i+1,...,n$ 之一.求从 $1$ 跳到 $n$ 的期望步数. $n\le 10^7$ . 题解 期望dp傻逼题 ...

  10. 【高斯消元】兼 【期望dp】例题

    [总览] 高斯消元基本思想是将方程式的系数和常数化为矩阵,通过将矩阵通过行变换成为阶梯状(三角形),然后从小往上逐一求解. 如:$3X_1 + 2X_2 + 1X_3 = 3$ $           ...

最新文章

  1. 从0学人脸识别,我花3小时复现了Eigenfaces For Recognition
  2. 机器学习奠基人Michael Jordan:下代技术是融合经济学,解读2项重要进展
  3. cocos2d-x一些核心概念介绍
  4. Java机器学习库ML之七分类预测输出概率值
  5. php div中的字上下居中,Div垂直居中效果怎么实现
  6. pytorch torch.nn.MSELoss(size_average=True)(均方误差【损失函数】)Mean Squared Error(MSE)、SSE(和方差)
  7. 全平台硬件解码渲染方法与优化实践
  8. terminal services 找不到_电脑局域网中查看不到其他计算机或无法连接的解决办法...
  9. XP硬盘分区软件测试面试,怎样让WinXP系统自检并修复硬盘?
  10. pcb钻孔披锋改善报告_钻孔孔钻偏改善报告
  11. 物联网传感技术——压电式传感器
  12. android+语音amr转mp3格式转换,安卓批量amr转mp3 微信amr批量转换
  13. 开放的在线客服系统Live Zilla
  14. 【中途相遇法】【STL】BAPC2014 K Key to Knowledge (Codeforces GYM 100526)
  15. 前端教程:用 Canvas 编织璀璨星空图
  16. Android Studio计算BMI小软件
  17. Revit建模中快速局部平面操作,一键搞定!
  18. 网络分层的真实含义是什么?
  19. 普通话测试软件测试成绩很差,普通话测试成绩的差异性分析
  20. linux强大的convert命令(可以对图像做各种处理!)

热门文章

  1. java 四字节uid,Java入门教程-序列化版本号serialVersionUID的作用
  2. win2003无法进入桌面_救急,如何通过命令行备份桌面重要文件?
  3. mysql数据库熟悉表空间数据文件_Oracle表空间和数据文件
  4. 将span隐藏的函数_分类汇总函数Subtotal和Aggregate应用技巧解读
  5. html5 获取文件属性,H5新属性--file文件读取
  6. java让对象分配在栈上_java – Hotspot何时可以在堆栈上分配对象?
  7. python网络运维案例代码库_OLDboy-python第八期运维教程
  8. python求函数极值_python 遗传算法求函数极值的实现代码
  9. mac 上mysql怎么卸载不了_mac的mysql怎么卸载?
  10. windows和linux命令行一样吗,微软改进Windows命令行 目的是和Linux命令行相抗衡