正题

题目链接:https://www.luogu.com.cn/problem/CF708E


题目大意

有\(n*m\)的矩形网格,然后每次每行最左边和最右边的格子各有\(p=\frac{c}{d}\)的概率会消失,进行\(k\)次。

求最后所有格子依旧四联通的概率,在\(\%(10^9+7)\)的情况下进行

\(1\leq n,m\leq 1500,1\leq k\leq 10^5\)


解题思路

\(n,m\)很小,感觉上不是一个暴力计数的题目。

可以考虑一个比较慢的方法先,先考虑一个方向腐蚀了\(i\)次的概率设为\(E_i\)那么显然地有

\[E_i=\binom k ip^{i}(1-p)^{k-i}
\]

然后设\(f_{i,l,r}\)表示到第\(i\)层时,剩下了\(l\sim r\)且上面的层都联通的概率。

那么一个简单的\(dp\)有

\[f_{i,l,r}=E_{l-1}E_{m-r}\times \sum_{[l',r']\cap[l,r]\neq \varnothing} f_{i-1,l',r'}
\]

先把这个方程优化到\(O(nm^2)\),设\(L_{i,j}=\sum_{l\leq r<j}f_{i,l,r},R_{i,j}=\sum_{r>l\geq j}f_{i,l,r},S_{i}=\sum f_{i,l,r}\)

那么有

\[f_{i,l,r}=E_{l-1}E_{m-r}(S_{i-1}-L_{i-1,l}-R_{i-1,r})
\]

嗯然后我们要把\(f\)的状态数转到\(O(nm)\)的,其实不难发现的一点是这些东西都具有对称性,也就是\(f_{i,l,r}=f_{i,n-r+1,n-l+1}\)。所有我们可以设\(F_{i,j}=\sum_{k=1}^jf_{i,k,j}\)

那么有\(L_{i,j}=\sum_{k=1}^jF_{i,k}\)因为对称性又有\(R_{i,j}=L_{i,n-j+1}\)所以此时我们已经可以表示出所有的\(F,L,R\)了。考虑这个\(F\)如何转移

\[F_{x,y}=\sum_{i=1}^yf_{x,i,y}=\sum_{i=1}^yE_{i-1}E_{m-y}(S_{x-1}-L_{x-1,i}-R_{x-1,y})
\]
\[\Rightarrow F_{x,y}=E_{m-y}(\ \ (S_{x-1}-R_{x-1,y})\sum_{i\leq y}E_{i-1}-\sum_{i\leq y}E_{i-1}L_{x-1,i}\ \ )
\]

这样就是\(O(nm)\)的了,可以通过本题


code

#include<cstdio>
#include<cstring>
#include<algorithm>
#define ll long long
using namespace std;
const ll N=1510,P=1e9+7,K=1e5+10;
ll n,m,p,q,k,fac[K],inv[K],E[N],S[N];
ll f[N][N],s[N][N],t[N][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;
}
ll C(ll n,ll m)
{return fac[n]*inv[m]%P*inv[n-m]%P;}
signed main()
{
scanf("%lld%lld",&n,&m);
scanf("%lld%lld",&p,&q);p=p*power(q,P-2)%P;
scanf("%lld",&k);q=P+1-p;inv[1]=1;
for(ll i=2;i<K;i++)inv[i]=P-inv[P%i]*(P/i)%P;
fac[0]=inv[0]=1;
for(ll i=1;i<K;i++)
fac[i]=fac[i-1]*i%P,inv[i]=inv[i-1]*inv[i]%P;
for(ll i=0;i<=min(k,m);i++)E[i]=C(k,i)*power(p,i)%P*power(q,k-i)%P;
S[0]=E[0];for(ll i=1;i<=m;i++)S[i]=(S[i-1]+E[i])%P;
s[0][m]=f[0][m]=1;
for(ll i=1;i<=n;i++){
for(ll j=1;j<=m;j++){
f[i][j]=E[m-j]*((s[i-1][m]-s[i-1][m-j])*S[j-1]%P-t[i-1][j])%P;
s[i][j]=(s[i][j-1]+f[i][j])%P;
t[i][j]=(t[i][j-1]+s[i][j-1]*E[j-1]%P)%P;
}
}
printf("%lld\n",(s[n][m]+P)%P);
return 0;
}

CF708E-Student‘s Camp【数学期望,dp】的更多相关文章

  1. codeforces1097D Makoto and a Blackboard 数学+期望dp

    题目传送门 题目大意: 给出一个n和k,每次操作可以把n等概率的变成自己的某一个因数,(6可以变成1,2,3,6,并且概率相等),问经过k次操作后,期望是多少? 思路:数学和期望dp  好题好题!! ...

  2. lightoj1038(数学期望dp)

    题意:输入一个数N,N每次被它的任意一个因数所除 变成新的N 这样一直除下去 直到 N变为1 求变成1所期望的次数 解析: d[i] 代表从i除到1的期望步数:那么假设i一共有c个因子(包括1和本身) ...

  3. 【BZOJ4872】[Shoi2017]分手是祝愿 数学+期望DP

    [BZOJ4872][Shoi2017]分手是祝愿 Description Zeit und Raum trennen dich und mich. 时空将你我分开.B 君在玩一个游戏,这个游戏由 n ...

  4. BZOJ 1426: 收集邮票 数学期望 + DP

    Description 有n种不同的邮票,皮皮想收集所有种类的邮票.唯一的收集方法是到同学凡凡那里购买,每次只能买一张,并且 买到的邮票究竟是n种邮票中的哪一种是等概率的,概率均为1/n.但是由于凡凡 ...

  5. Student's Camp CodeForces - 708E (dp,前缀和优化)

    大意: $n$行$m$列砖, 白天左侧边界每块砖有$p$概率被摧毁, 晚上右侧边界有$p$概率被摧毁, 求最后上下边界连通的概率. 记${dp}_{i,l,r}$为遍历到第$t$行时, 第$t$行砖块 ...

  6. CF708E Student's Camp

    麻麻我会做*3100的计数了,我出息了 考虑朴素DP我们怎么做呢. 设\(f_{i,l,r}\)为第\(i\)层选择\(l,r\)的依旧不倒的概率. \(q(l,r)\)表示经历了\(k\)天后,存活 ...

  7. 【CF712E】Memory and Casinos(数学 期望 DP)

    题目链接 大意 给出一个序列,当你在某个点时,有一个向右走的概率\(P_i\)(向左为\(1-P_i\)), 给出\(M\)个操作,操作有两类: 1 X Y Z:把\(P_X\)的值修改为\(\fra ...

  8. [题解]数学期望_luogu_P1850_换教室

    数学期望dp,题面第一次见很吓人,然而从CCF语翻译成人话就简单多了, 开始一般会想到用 f [ i ] [ j ]表示前 i 个课程申请 j 次的期望,然而其实会发现转移的时候还和上一次的情况有关( ...

  9. 【CF708E】Student's Camp 组合数+动态规划

    [CF708E]Student's Camp 题意:有一个n*m的网格,每一秒钟,所有左面没有格子的格子会有p的概率消失,右面没有格子的格子也会有p的概率消失,问你t秒钟后,整个网格的上边界和下边界仍 ...

随机推荐

  1. WPF 自己做一个颜色选择器

    程序开发过程中,经常会遇到需要支持动态配置主题颜色的问题,通常,一个程序会有多种不同的颜色风格主题供选 有时候,更细致一些的地方,会需要支持自己配置颜色,这样我们就需要一个颜色选择器啦,下面是我自己开 ...

  2. mybatis传入参数为0被误认为是空字符串的解决方法

    在mbatis中使用Xml配置sql语句时,出现了这样一个问题.当我传入的参数为0去做判断时,mybatis会把参数0当成是空字符串去判断而引起查询结果错误 所以在做项目时一定要注意,用到MyBati ...

  3. CSS定位(慕课网学习笔记)

    定位模型 static自然模型 relative相对定位模型 absolute绝对定位模型 fixed固定定位模型 sticky磁铁定位模型 possition之static(默认的设置)(静态定位. ...

  4. ES6两种静态属性的书写方法

    1.这种可以不用实例化对象就能输出. class Car{ constructor(){ } } Car.tool=4 console.log(Car.tool);//4 2.必须实例化后才能输出.但 ...

  5. promise链式调用的应用

    then在链式调用时,会等前一个then或者函数执行完毕,返回状态,才会执行回调函数. (1)代码顺序执行,第一步调用了函数cook ,cook执行返回了一个promise,promise返回的是成功 ...

  6. ASP.NET真分页_接前篇引用AspNetPager.dll进行数据分页

    一.前端准备工作 1.之前我写到过<Asp.net中引用AspNetPager.dll进行数据分页>  这种分页方式只能在前台将数据分页,而每次点击查询时对目标数据库还是全查询,这样不仅会 ...

  7. Tensorflow 2.0 深度学习实战 —— 详细介绍损失函数、优化器、激活函数、多层感知机的实现原理

    前言 AI 人工智能包含了机器学习与深度学习,在前几篇文章曾经介绍过机器学习的基础知识,包括了监督学习和无监督学习,有兴趣的朋友可以阅读< Python 机器学习实战 >.而深度学习开始只 ...

  8. 关于python使用的那些事儿

    时间:2019-04-11 整理:PangYuaner 标题:Python获取并输出当前日期时间 地址:https://www.cnblogs.com/kerwinC/p/5760811.html 实 ...

  9. Python语法之函数、引用和装饰器

    所谓函数,就是把具有独立功能的代码块组织成为一个小模块,在需要的时候调用 函数是带名字的代码块,用于完成具体的工作 需要在程序中多次执行同一项任务时,你无需反复编写完成该任务的代码,而只需调用该 任务 ...

  10. Springboot 整合通用mapper和pagehelper展示分页数据(附github源码)

    简介 springboot 设计目的就是为了加速开发,减少xml的配置.如果你不想写配置文件只需要在配置文件添加相对应的配置就能快速的启动的程序. 通用mapp 通用mapper只支持对单表的操作,对 ...