题目大意:
  一个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. 2017 ACM暑期多校联合训练 - Team 4 1012 HDU 6078 Wavel Sequence (模拟)

    题目链接 Problem Description Have you ever seen the wave? It's a wonderful view of nature. Little Q is a ...

  2. lintcode 66.67.68 二叉树遍历(前序、中序、后序)

    AC代码: /** * Definition of TreeNode: * public class TreeNode { * public int val; * public TreeNode le ...

  3. php常用表单验证类用法实例

    <?php /** * 页面作用:常用表单验证类 * 作 者:欣然随风 * QQ:276624915 */ class class_post { //验证是否为指定长度的字母/数字组合 func ...

  4. ORA-01552 非系统表空间不能使用系统回滚段处理

    今天新搭建了一个10g的测试数据库,运行都很正常,但是在打开autotrace功能后执行语句,报错 SQL> set autotrace on SQL> select username,s ...

  5. device tree --- #address-cells and #size-cells property

    device tree source Example1 / { #address-cells = <0x1>; // 在 root node 下使用 1 個 u32 來代表 address ...

  6. java各种链路工具性能监控工具

    Zipkin , Instana 和 Jaeger cat链路追踪系统 用于监控spring 的运行情况,比如内存,线程,池等宏观数据 spring boot admin java反编译 jar xv ...

  7. laravel 上传文件到亚马逊 aws s3

    参考: https://github.com/aws/aws-sdk-php-laravel https://www.jianshu.com/p/e48d82bff20b

  8. python之pandas&&DataFrame

    1.Series  Series是一个一维数组 pandas会默认从0开始作为Series的index >>> test = pd.Series(['num0','num1','nu ...

  9. xcode上真机调试iphone4s出现“There was an internal API error.”解决方案

    xcode7更新之后使用真机调试,在IOS8的一台Iphone5手机上面没什么问题,IOS8的一台iphone6也没问题.但是在IOS6的一台Iphone4s和 IOS7的ipad air2上面在最后 ...

  10. git - git命令中文显示乱码

    使用git add添加要提交的文件的时候,如果文件名是中文,会显示形如897\232\350\256...的乱码,解决办法:   git config --global core.quotepath ...