[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 ...
随机推荐
- Sublime之快捷键(二)
1. 在使用Sublime的时候,经常用到选中文件中相同的一些字段,那怎么办呢? 快捷键: ctrl + d 可以快速的选择,你所选中的文字,每次按下该快捷键,就会自动的寻找相同的字段: Alt + ...
- uboot之---make smdk2410_config命令详细解析
先进入顶层Makefile.有很多相对不同板子的配置,如: gec2440_config:unconfig @$(MKCONFIG) $(@:_config=) arm arm920t gec2440 ...
- 一文掌握关于Java数据结构所有知识点(欢迎一起完善)
在我们学习Java的时候,很多人会面临我不知道继续学什么或者面试会问什么的尴尬情况(我本人之前就很迷茫).所以,我决定通过这个开源平台来帮助一些有需要的人,通过下面的内容,你会掌握系统的Java学习以 ...
- 初识smarty
个人体会(不完全正确):就是smarty就是为了更好的使得php/html结合做出来的一个框架. ,
- imperva agent 的重新注册
情况是这样 公司搭了一个环境有mysql的数据库并且安装了agent,imperva管理平台上也可以看到agent的注册信息,但是没想到的是有人把我的虚机给还原快照了,而且还没保存..... 这次写个 ...
- python并发编程之asyncio协程(三)
协程实现了在单线程下的并发,每个协程共享线程的几乎所有的资源,除了协程自己私有的上下文栈:协程的切换属于程序级别的切换,对于操作系统来说是无感知的,因此切换速度更快.开销更小.效率更高,在有多IO操作 ...
- Codeforces Round #456 (Div. 2)
Codeforces Round #456 (Div. 2) A. Tricky Alchemy 题目描述:要制作三种球:黄.绿.蓝,一个黄球需要两个黄色水晶,一个绿球需要一个黄色水晶和一个蓝色水晶, ...
- 如何使用curl命令指定ip访问url
有时我们需要测试一个url,但域名并没解析,这时为了一个简单的测试而写host或去做域名解析,显然这并不高效,而有些域名甚至是正式的域名,因此我们可有使用curl命令进行测试 方法一 curl url ...
- Spring Cloud Feign 在调用接口类上,配置熔断 fallback后,输出异常
Spring Cloud Feign 在调用接口类上,配置熔断 fallback后,出现请求异常时,会进入熔断处理,但是不会抛出异常信息. 经过以下配置,可以抛出异常: 将原有ErrorEncoder ...
- udev和rules使用规则
本文以通俗的方法阐述 udev 及相关术语的概念.udev 的配置文件和规则文件,然后以 Red Hat Enterprise Server 为平台演示一些管理设备文件和查询设备信息的实例.本文会使那 ...