[CodeForces-708E]Student's Camp
题目大意:
一个n*m的墙,被吹k天风,每块靠边的砖都有p的概率被吹掉。
如果上下两行没有直接相连的地方,我们则认为这一堵墙已经倒塌。
问最后墙不倒塌的概率(模意义)。
思路:
动态规划。
用f[i][j][k]表示到了第i层,只剩下j~k的砖头并且不倒塌的概率。
则f[i][j][k]=sum{f[i-1][l][r]|[l,r]与[j,k]有交集}*这一层只剩[l,r]的概率。
概率可以O(n)预处理,接下来要枚举i,j,k,l,r,所以是O(m^4n)的。
接下来考虑预处理sum{f[i-1][l][r]|[l,r]与[j,k]有交集}。
显然有交集的概率=总概率-没有交集的概率=总概率-r<i的概率-j<l的概率。
而这些概率都可以一边转移一边推。
这样转移的时候就不需要考虑具体的l,r,是O(m^2n)的。
数组1500^3还会爆,考虑滚动数组,勉强开下,反正还是TLE。
正解是一个很神奇的O(mn)算法。(并不是很懂)
考虑用f[i][k]表示前面的f[i][1][k]~f[i][k][k]的和。
然后预处理所有关于j的前缀和。
然后递推式就只与i,k有关了。
#include<cstdio>
#include<cctype>
typedef long long int64;
inline int getint() {
register char ch;
while(!isdigit(ch=getchar()));
register int x=ch^'';
while(isdigit(ch=getchar())) x=(((x<<)+x)<<)+(ch^'');
return x;
}
const int mod=1e9+;
const int N=,M=,K=;
void exgcd(const int &a,const int &b,int &x,int &y) {
if(!b) {
x=;
y=;
return;
}
exgcd(b,a%b,y,x);
y-=a/b*x;
}
inline int inv(const int64 &x) {
int tmp,ret;
exgcd(x,mod,ret,tmp);
return (ret+mod)%mod;
}
int f[][M];
int p[K],q[K];
int fact[K],tcaf[K];
int k;
inline int calc(const int &x) {
return (int64)fact[k]*tcaf[k-x]%mod*tcaf[x]%mod*p[x]%mod*q[k-x]%mod;
}
int main() {
int n=getint(),m=getint();
int a=getint(),b=getint();
k=getint();
fact[]=;
for(register int i=;i<=k;i++) {
fact[i]=(int64)fact[i-]*i%mod;
}
tcaf[k]=inv(fact[k]);
for(register int i=k-;~i;i--) {
tcaf[i]=(int64)tcaf[i+]*(i+)%mod;
}
p[]=q[]=;
p[]=q[]=inv(b);
p[]=(int64)p[]*a%mod;
q[]=(int64)q[]*(b-a)%mod;
for(register int i=;i<=k;i++) {
p[i]=(int64)p[i-]*p[]%mod;
q[i]=(int64)q[i-]*q[]%mod;
}
f[][m]=;
for(register int i=;i<=n;i++) {
int s1=,s2=;
for(register int j=;j<=m;j++) {
f[i&][j]=((int64)s1*(f[!(i&)][m]-f[!(i&)][m-j])-s2)%mod*calc(m-j)%mod;
s1=(s1+calc(j))%mod;
s2=(s2+(int64)f[!(i&)][j]*calc(j))%mod;
}
for(register int j=;j<=m;j++) {
f[i&][j]=(f[i&][j]+f[i&][j-])%mod;
}
}
printf("%d\n",(f[n&][m]+mod)%mod);
return ;
}
[CodeForces-708E]Student's Camp的更多相关文章
- Codeforces 708E - Student's Camp(前缀和优化 dp)
Codeforces 题目传送门 & 洛谷题目传送门 神仙 *3100,%%% 首先容易注意到 \(\forall i\in[1,m]\),第 \(i\) 行剩余的砖块一定构成一个区间,设其为 ...
- 【CF708E】Student's Camp 组合数+动态规划
[CF708E]Student's Camp 题意:有一个n*m的网格,每一秒钟,所有左面没有格子的格子会有p的概率消失,右面没有格子的格子也会有p的概率消失,问你t秒钟后,整个网格的上边界和下边界仍 ...
- Student's Camp CodeForces - 708E (dp,前缀和优化)
大意: $n$行$m$列砖, 白天左侧边界每块砖有$p$概率被摧毁, 晚上右侧边界有$p$概率被摧毁, 求最后上下边界连通的概率. 记${dp}_{i,l,r}$为遍历到第$t$行时, 第$t$行砖块 ...
- codeforces 672A A. Summer Camp(水题)
题目链接: A. Summer Camp time limit per test 1 second memory limit per test 256 megabytes input standard ...
- [Codeforces708E]Student's Camp
Problem 一个n*m块砖的建筑,一共k天,每天风从两边吹,吹掉砖的概率为p,反之为1-p,求最终建筑没有倒塌的可能性(上层与下层有交集且每一层都有砖) Solution 首先,我们可以预处理出p ...
- Codeforces 1167c(ccpc wannafly camp day1) News Distribution 并查集模板
题目: In some social network, there are nn users communicating with each other in mm groups of friends ...
- CF708E Student's Camp
麻麻我会做*3100的计数了,我出息了 考虑朴素DP我们怎么做呢. 设\(f_{i,l,r}\)为第\(i\)层选择\(l,r\)的依旧不倒的概率. \(q(l,r)\)表示经历了\(k\)天后,存活 ...
- Codeforces Round #588 (Div. 2) D. Marcin and Training Camp(思维)
链接: https://codeforces.com/contest/1230/problem/D 题意: Marcin is a coach in his university. There are ...
- Codeforces Round #335 (Div. 2) D. Lazy Student 构造
D. Lazy Student Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/contest/606/probl ...
随机推荐
- [洛谷P1029]最大公约数与最小公倍数问题 题解(辗转相除法求GCD)
[洛谷P1029]最大公约数与最小公倍数问题 Description 输入二个正整数x0,y0(2<=x0<100000,2<=y0<=1000000),求出满足下列条件的P, ...
- Xcode 获取本地IP
// // // #define MAXADDRS 32 extern char *ip_names[MAXADDRS]; void InitAddresses(); void GetIPAddres ...
- django框架之中间件
中间件简介 django 中的中间件(middleware),在django中,中间件其实就是一个类,在请求到来和结束后,django会根据自己的规则在合适的时机执行中间件中相应的方法. 在djang ...
- Term Term ssh登陆linux后 显示乱码
setup----terminal----locale----“chinese” OK!!!!!
- [转载]FFmpeg完美入门[4] - FFmpeg应用实例
1 用FFserver从文件生成流媒体 一.安装ffmpeg 在ubuntu下,运行sudo apt-get ffmpeg 安装ffmpeg,在其他linux操作系统下,见ffmpeg的编译过程(编译 ...
- C/C++——二维数组与指针、指针数组、数组指针(行指针)、二级指针的用法
本文转载自:https://blog.csdn.net/qq_33573235/article/details/79530792 1. 二维数组和指针 要用指针处理二维数组,首先要解决从存储的角度对二 ...
- 高屋建瓴之WebMail攻与防
0x01:前言 随着互联网的快速发展,我们的生活与互联网的联系愈加的紧密.各种快捷方便的信息化通信工具渐渐取代了传统的通信方式.微博.QQ.MSN.微信.陌陌, …这样的社交软件和平台已经成为了我们生 ...
- Linux 用户篇——用户管理的配置文件
一.用户管理之配置文件的重要性 在Linux系统中,用户账户的相关信息是存放在相关配置文件中.而Linux安全系统的核心是用户账号,用户对系统中各种对象的访问权限取决于他们登录系统时用的账户,并且Li ...
- django的orm获取字段去重值
如果要用django的ORM获取一个表字段所有可能的去重值. 网上找了很多,都是用distinct关键字,但如何没有随后的order_by, 还是达不到要求的. 最后搞定. 参考URL http:// ...
- 语音性别识别 - 使用R提取特征
步骤 1)安装R.windows操作系统安装包的链接:https://cran.r-project.org/bin/windows/base/ 2)切换当前路径为脚本所在路径 点击 文件 > 改 ...