题目大意:
  一个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的更多相关文章

  1. Codeforces 708E - Student's Camp(前缀和优化 dp)

    Codeforces 题目传送门 & 洛谷题目传送门 神仙 *3100,%%% 首先容易注意到 \(\forall i\in[1,m]\),第 \(i\) 行剩余的砖块一定构成一个区间,设其为 ...

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

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

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

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

  4. codeforces 672A A. Summer Camp(水题)

    题目链接: A. Summer Camp time limit per test 1 second memory limit per test 256 megabytes input standard ...

  5. [Codeforces708E]Student's Camp

    Problem 一个n*m块砖的建筑,一共k天,每天风从两边吹,吹掉砖的概率为p,反之为1-p,求最终建筑没有倒塌的可能性(上层与下层有交集且每一层都有砖) Solution 首先,我们可以预处理出p ...

  6. 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 ...

  7. CF708E Student's Camp

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

  8. 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 ...

  9. 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 ...

随机推荐

  1. 【洛谷 P1502】 窗口的星星(扫描线)

    题目链接 把每个星星作为左下角,做出长为\(w-0.5\),宽为\(h-0.5\)的矩形. \(-0.5\)是因为边框上的不算. 离散化\(y\)坐标. 记录\(2n\)个\(4\)元组\((x,y1 ...

  2. ogg数据初始化历程记录

    之前,源端数据表结构发生改变,不知道前面的同事是怎么搞得(生成的数据定义文件不对,还是没有把进程启动),造成进程停止20天,然后重启复制进程,对比源端和目标端数据有差异(总共差10000多条数据),问 ...

  3. virsh 命令最新整理。 每个“;”之后是正解

    1,migrate --domain --destURL --dname  --live(热迁移) migrate lf 192.168.16.3 dname 2,managedsave domain ...

  4. elk系列3之通过json格式采集Nginx日志【转】

    转自 elk系列3之通过json格式采集Nginx日志 - 温柔易淡 - 博客园http://www.cnblogs.com/liaojiafa/p/6158245.html preface 公司采用 ...

  5. 【技术分享】ReBreakCaptcha:利用谷歌来破解谷歌的验证码

    概述 从2016年开始,我就在琢磨寻找一种新的绕过谷歌验证码v2的方法会有多难,如果这种方法能够适用于任何环境而不仅仅是针对特定的案例,那这种方法将是非常理想的.接下来我将向你介绍ReBreakCap ...

  6. 【Learn】CSS定义

    CSS基础语法 本文用于介绍CSS相关的知识,用于记录自己的学习笔记.由于我已经熟悉了部分的HTML,所以相关的概念也不在这里进行描述了,直接写自己的一些心得感悟. 1.CSS规则 CSS是由两个主要 ...

  7. Java 序列化工具类

    import org.slf4j.Logger; import org.slf4j.LoggerFactory; import sun.misc.BASE64Decoder; import sun.m ...

  8. 在ubuntu上安装Chrome

    1.下载谷歌浏览器源文件.链接有很多,以下是64位版本的下载地址 https://dl.google.com/linux/direct/google-chrome-stable_current_amd ...

  9. 终止函数 atexit()

    函数名: atexit   头文件:#include<stdlib.h>   功 能: 注册终止函数(即main执行结束后调用的函数)   用 法: int atexit(void (*f ...

  10. ISSCC 2017论文导读 Session 14:A 288μW Programmable Deep-Learning Processor with 270KB On-Chip Weight

    A 288μW Programmable Deep-Learning Processor with 270KB On-Chip Weight Storage Using Non-Uniform Mem ...