题目大意:
  一个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. [洛谷P1029]最大公约数与最小公倍数问题 题解(辗转相除法求GCD)

    [洛谷P1029]最大公约数与最小公倍数问题 Description 输入二个正整数x0,y0(2<=x0<100000,2<=y0<=1000000),求出满足下列条件的P, ...

  2. Xcode 获取本地IP

    // // // #define MAXADDRS 32 extern char *ip_names[MAXADDRS]; void InitAddresses(); void GetIPAddres ...

  3. django框架之中间件

    中间件简介 django 中的中间件(middleware),在django中,中间件其实就是一个类,在请求到来和结束后,django会根据自己的规则在合适的时机执行中间件中相应的方法. 在djang ...

  4. Term Term ssh登陆linux后 显示乱码

    setup----terminal----locale----“chinese” OK!!!!!

  5. [转载]FFmpeg完美入门[4] - FFmpeg应用实例

    1 用FFserver从文件生成流媒体 一.安装ffmpeg 在ubuntu下,运行sudo apt-get ffmpeg 安装ffmpeg,在其他linux操作系统下,见ffmpeg的编译过程(编译 ...

  6. C/C++——二维数组与指针、指针数组、数组指针(行指针)、二级指针的用法

    本文转载自:https://blog.csdn.net/qq_33573235/article/details/79530792 1. 二维数组和指针 要用指针处理二维数组,首先要解决从存储的角度对二 ...

  7. 高屋建瓴之WebMail攻与防

    0x01:前言 随着互联网的快速发展,我们的生活与互联网的联系愈加的紧密.各种快捷方便的信息化通信工具渐渐取代了传统的通信方式.微博.QQ.MSN.微信.陌陌, …这样的社交软件和平台已经成为了我们生 ...

  8. Linux 用户篇——用户管理的配置文件

    一.用户管理之配置文件的重要性 在Linux系统中,用户账户的相关信息是存放在相关配置文件中.而Linux安全系统的核心是用户账号,用户对系统中各种对象的访问权限取决于他们登录系统时用的账户,并且Li ...

  9. django的orm获取字段去重值

    如果要用django的ORM获取一个表字段所有可能的去重值. 网上找了很多,都是用distinct关键字,但如何没有随后的order_by, 还是达不到要求的. 最后搞定. 参考URL http:// ...

  10. 语音性别识别 - 使用R提取特征

    步骤 1)安装R.windows操作系统安装包的链接:https://cran.r-project.org/bin/windows/base/ 2)切换当前路径为脚本所在路径 点击 文件 > 改 ...