codeforces 722E Research Rover

题意

\(1e5*1e5\)的棋盘中有\(2000\)个坏点,初始给定一个值\(s(1<=s<=1e6)\)。从棋盘左上角走到右下角,只允许向右或者向下走,每经过一个坏点,\(s=\lceil{s/2}\rceil\),求到达棋盘右下角时,\(s\)的值的期望。

题解

经过\(log\)级别的坏点之后,\(s\)的值就衡为\(1\)了。对所有坏点根据\(x\)从小到大,\(y\)从小到大排序。

\(f_{i, j}\)表示从坏点\(i\)走到右下角经过\(j\)个坏点(不包括\(i\))。

\(f_{i, 0}=Paths(i, 右下角)(所有情况)-\Sigma_{k!=i}{(Paths(i, k)*f_{k, 0})}(经过坏点个数大于零个的情况)\)

\(f_{i, j}=Paths(i, 右下角)(所有情况)-\Sigma_{k!=i}{(Paths(i, k)*f_{k, j})}(经过坏点个数大于j个的情况)-\Sigma_{k=0}^{j-1}{f_{i,k}}(经过坏点个数小于j个的情况)\)

代码

#include<bits/stdc++.h>
using namespace std;
#define fi first
#define se second
#define mp make_pair
#define pb push_back
#define rep(i, a, b) for(int i=(a); i<(b); i++)
#define sz(x) (int)x.size()
#define de(x) cout<< #x<<" = "<<x<<endl
#define dd(x) cout<< #x<<" = "<<x<<" "
typedef long long ll;
typedef pair<int, int> pii;
typedef vector<int> vi;
//------ const int N=2020, mod=1e9+7;
int n,m,k,s;
bool isa;
pii a[N];
ll f[N][22], jc[201010], inv[201010];
int val[22]; ll kpow(ll a,ll b) {
ll res=1;
while(b) {
if(b&1) res=res*a%mod;
a=a*a%mod;
b>>=1;
}
return res;
} void init() {
jc[0]=1;
rep(i,1,201010) jc[i]=jc[i-1]*i%mod;
inv[201010-1]=kpow(jc[201010-1], mod-2);
for(int i=201010-2;i>=0;--i) inv[i]=inv[i+1]*(i+1)%mod;
} ll C(int n, int m) {
if(n<0||m<0) return 0;
return jc[n]*inv[m]%mod*inv[n-m]%mod;
} ll pa(int n, int m) {
return C(n+m, m);
} void upd(ll &a, ll b) {
a=(a+b)%mod;
if(a<0) a+=mod;
} int main() {
init();
while(~scanf("%d%d%d%d",&n,&m,&k,&s)) {
///init
isa=0;
///read
rep(i,0,k) {
int x,y;scanf("%d%d",&x,&y);
if(x==1&&y==1) isa=1;
a[i]=mp(x, y);
}
///get val
int p;
for(p=0;s>1;++p) {
val[p]=s;
s=(s+1)/2;
}
val[p]=1;
///solve
if(!isa) a[k++]=mp(1, 1);
sort(a,a+k);
for(int i=k-1;i>=0;--i) {
f[i][0]=pa(n-a[i].fi, m-a[i].se);
rep(j,i+1,k) {
upd(f[i][0], -pa(a[j].fi-a[i].fi, a[j].se-a[i].se)*f[j][0]%mod);
}
}
rep(j,1,p) {
for(int i=k-1;i>=0;--i) {
f[i][j]=pa(n-a[i].fi, m-a[i].se);
rep(_,i+1,k) {
upd(f[i][j], -pa(a[_].fi-a[i].fi, a[_].se-a[i].se)*f[_][j]%mod);
}
rep(_,0,j) {
upd(f[i][j], -f[i][_]);
}
}
}
ll cnt=pa(n-1, m-1), ans=kpow(cnt, mod-2), sum=0;
rep(j,0,p) {
upd(cnt, -f[0][j]);
int t=j+isa;
upd(sum, f[0][j]*val[t]%mod);
}
upd(sum, cnt);
ans=ans*sum%mod;
printf("%lld\n",ans);
}
return 0;
}

codeforces 722E Research Rover的更多相关文章

  1. 【Foreign】Research Rover [DP]

    Research Rover Time Limit: 25 Sec  Memory Limit: 256 MB Description Input Output 仅一行一个整数表示答案. Sample ...

  2. [Codeforces722E] Research Rover (dp+组合数学)

    [Codeforces722E] Research Rover (dp+组合数学) 题面 给出一个N*M的方格阵,从(1,1)出发,到(N,M)结束,从(x,y)只能走到(x+1,y)或(x,y+1) ...

  3. Codeforces 1010D Mars rover

    题目大意:对于一个不完全二分图,根节点为1,叶节点值为0或1,非叶节点包含一个操作(and,or,xor,not),求改变各个叶节点的值时(即0改为1,1改为0),根节点的值是多少 解法:遍历图求各节 ...

  4. Codeforces 722E 组合数学 DP

    题意:有一个n * m的棋盘,你初始在点(1, 1),你需要去点(n, m).你初始有s分,在这个棋盘上有k个点,经过一次这个点分数就会变为s / 2(向上取整),问从起点到终点的分数的数学期望是多少 ...

  5. codeforces722E

    CF722E Research Rover Unfortunately, the formal description of the task turned out to be too long, s ...

  6. 【Codeforces Round #432 (Div. 2) A】 Arpa and a research in Mexican wave

    [链接]h在这里写链接 [题意] 在这里写题意 [题解] t<=k,输出t t>=n,输出k-t+n 其他情况都是k [错的次数] 0 [反思] 在这了写反思 [代码] /* */ #in ...

  7. Codeforces Gym 100002 D"Decoding Task" 数学

    Problem D"Decoding Task" Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com ...

  8. 【Codeforces Round】 #432 (Div. 2) 题解

    Codeforces Round #432 (Div. 2, based on IndiaHacks Final Round 2017)  A. Arpa and a research in Mexi ...

  9. Codeforces C. NP-Hard Problem 搜索

    C. NP-Hard Problem time limit per test:2 seconds memory limit per test:256 megabytes input:standard ...

随机推荐

  1. 开始使用 Vuejs 2.0 ---简单总结1

    Vue.js(读音 /vjuː/, 类似于 view) 是一套构建用户界面的 渐进式框架.与其他重量级框架不同的是,Vuejs 采用自底向上增量开发的设计.Vuejs 的核心库只关注视图层,并且非常容 ...

  2. 吴恩达《深度学习》第四门课(3)目标检测(Object detection)

    3.1目标定位 (1)案例1:在构建自动驾驶时,需要定位出照片中的行人.汽车.摩托车和背景,即四个类别.可以设置这样的输出,首先第一个元素pc=1表示有要定位的物体,那么用另外四个输出元素表示定位框的 ...

  3. android_serialport_api代码分析

    1. 导入Android studio android_serialport_api是一个开源的串口测试工具,代码应该是用eclipse工程(不确定,没用过eclipse,反正不是Android st ...

  4. [转]IIS的各种身份验证详细测试

    本文转自:http://www.cnblogs.com/chnking/archive/2007/11/20/965553.html#_Toc183326163 一.    IIS的身份验证概述 1. ...

  5. GPUImage使用

    GPUImage项目下载地址:https://github.com/BradLarson/GPUImage.git 下载项目时如果下载不下来可以直接check一份(之前下载了好多次都是下载失败,最后没 ...

  6. g2o error2

    ./pose_estimation_3d2d: error while loading shared libraries: libg2o_core.so: cannot open shared obj ...

  7. CenOs7安装oracle图文详细过程(01)

    原创作品,转载请在文章头部(显眼位置)注明出处:https://www.cnblogs.com/sunshine5683/p/10011441.html 1.检查必要的安装包是否安装 命令脚本: rp ...

  8. vi 多行注释和取消注释

    注释 :1,10 s/^/#/   注释1到10行 取消注释 ctl+v 进入visual block模式 选中 #号 按d 或x 将其删除

  9. Apache shiro的简单介绍与使用(与spring整合使用,并加入ehcache缓存权限数据)

    apache shiro框架简介 Apache Shiro是一个强大而灵活的开源安全框架,它能够干净利落地处理身份认证,授权,企业会话管理和加密.现在,使用Apache Shiro的人越来越多,因为它 ...

  10. 如何使DIV居中

    小编我抛出一个问题: 有一个 div#wrapper 元素,高.宽度都未知.它其中有一个宽高都为 100px 的 div#box 元素,请你完成 CSS,使得 div#box 在 div#wrappe ...