codeforces722E
CF722E Research Rover
Unfortunately, the formal description of the task turned out to be too long, so here is the legend.
Research rover finally reached the surface of Mars and is ready to complete its mission. Unfortunately, due to the mistake in the navigation system design, the rover is located in the wrong place.
The rover will operate on the grid consisting of n rows and m columns. We will define as (r, c) the cell located in the row r and column c. From each cell the rover is able to move to any cell that share a side with the current one.
The rover is currently located at cell (1, 1) and has to move to the cell (n, m). It will randomly follow some shortest path between these two cells. Each possible way is chosen equiprobably.
The cargo section of the rover contains the battery required to conduct the research. Initially, the battery charge is equal to s units of energy.
Some of the cells contain anomaly. Each time the rover gets to the cell with anomaly, the battery looses half of its charge rounded down. Formally, if the charge was equal to x before the rover gets to the cell with anomaly, the charge will change to .
While the rover picks a random shortest path to proceed, compute the expected value of the battery charge after it reaches cell (n, m). If the cells (1, 1) and (n, m)contain anomaly, they also affect the charge of the battery.
Input
The first line of the input contains four integers n, m, k and s (1 ≤ n, m ≤ 100 000, 0 ≤ k ≤ 2000, 1 ≤ s ≤ 1 000 000) — the number of rows and columns of the field, the number of cells with anomaly and the initial charge of the battery respectively.
The follow k lines containing two integers ri and ci (1 ≤ ri ≤ n, 1 ≤ ci ≤ m) — coordinates of the cells, containing anomaly. It's guaranteed that each cell appears in this list no more than once.
Output
The answer can always be represented as an irreducible fraction . Print the only integer P·Q - 1 modulo 109 + 7.
Examples
3 3 2 11
2 1
2 3
333333342
4 5 3 17
1 2
3 3
4 1
514285727
1 6 2 15
1 1
1 5
4
Note
In the first sample, the rover picks one of the following six routes:
, after passing cell (2, 3) charge is equal to 6.
, after passing cell (2, 3) charge is equal to 6.
, charge remains unchanged and equals 11.
, after passing cells (2, 1) and (2, 3)charge equals 6 and then 3.
, after passing cell (2, 1) charge is equal to 6.
, after passing cell (2, 1) charge is equal to 6.
Expected value of the battery charge is calculated by the following formula:
.
Thus P = 19, and Q = 3.
3 - 1 modulo 109 + 7 equals 333333336.
19·333333336 = 333333342 (mod 109 + 7)
题意:给出一个n*m的方格阵,从(1,1)走到(n,m),只能向下或向右走,(1,1)会有一个初始分数s。在整个图中有k个特殊点,每经过一个点,都会将目前剩余的分数除以2且向上取整。求(1,1)到(n,m)的期望得分。
sol:
dp[i][j]表示从第i个障碍走到(n,m)经过j个障碍的方案数
因为经过最多20个S就会变成1,所以不用算下去了
转移容易,就是用所有方案数减去所有经过点超过j个的方案数在减去经过点小于j个的方案数即可
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
inline ll read()
{
ll s=; bool f=; char ch=' ';
while(!isdigit(ch)) {f|=(ch=='-'); ch=getchar();}
while(isdigit(ch)) {s=(s<<)+(s<<)+(ch^); ch=getchar();}
return (f)?(-s):(s);
}
#define R(x) x=read()
inline void write(ll x)
{
if(x<) {putchar('-'); x=-x;}
if(x<) {putchar(x+''); return;}
write(x/); putchar((x%)+'');
}
#define W(x) write(x),putchar(' ')
#define Wl(x) write(x),putchar('\n')
const ll Mod=;
const int N=,M=;
int n,m,K,S;
ll fac[M],invf[M];
ll dp[N][],ans=;
/*
dp[i][j]表示从第i个障碍走到(n,m)经过j个障碍的方案数
因为经过最多20个S就会变成1,所以不用算下去了
转移容易,就是用所有方案数减去所有经过点超过j个的方案数在减去经过点小于j个的方案数即可
*/
struct Node{int x,y;}P[];
inline bool cmpx(Node p,Node q)
{
return (p.x!=q.x)?(p.x<q.x):(p.y<q.y);
}
inline ll ksm(ll x,ll y)
{
ll res=;
while(y)
{
if(y&) res=res*x%Mod; x=x*x%Mod; y>>=;
}return res;
}
inline ll C(ll n,ll m)
{
if(n<m)return ;
return fac[n]*invf[m]%Mod*invf[n-m]%Mod;
}
int main()
{
freopen("data.in","r",stdin);
int i,j,k;
R(n); R(m); R(K); R(S);
fac[]=invf[]=;
for(i=;i<=n+m;i++) fac[i]=fac[i-]*i%Mod;
invf[n+m]=ksm(fac[n+m],Mod-);
for(i=n+m-;i>=;i--) invf[i]=invf[i+]*(i+)%Mod;
for(i=;i<=K;i++)
{
R(P[i].x); R(P[i].y);
}
P[++K]=(Node){,};
// cout<<"K="<<K<<endl;
sort(P+,P+K+,cmpx);
for(i=K;i>=;i--)
{
dp[i][]=C(n-P[i].x+m-P[i].y,n-P[i].x);
for(j=i+;j<=K;j++) if(P[j].y>=P[i].y)
{
dp[i][]=(dp[i][]-C(P[j].x-P[i].x+P[j].y-P[i].y,P[j].x-P[i].x)*dp[j][]%Mod+Mod)%Mod;
}
}
for(i=K;i>=;i--)
{
for(j=;j<=;j++)
{
dp[i][j]=C(n-P[i].x+m-P[i].y,n-P[i].x);
for(k=i+;k<=K;k++) if(P[k].y>=P[i].y)
{
dp[i][j]=(dp[i][j]-C(P[k].x-P[i].x+P[k].y-P[i].y,P[k].x-P[i].x)*dp[k][j]%Mod+Mod)%Mod;
}
for(k=;k<=j-;k++) dp[i][j]=(dp[i][j]-dp[i][k]+Mod)%Mod;
}
}
// cout<<dp[1][0]<<" "<<dp[1][1]<<" "<<dp[2][0]<<" "<<dp[2][1]<<endl;
ll ff=,num=,oo;
while(S>)
{
ff=(ff+dp[][num])%Mod;
ans=(ans+dp[][num]*S%Mod)%Mod;
num++; S=(S%)+(S/);
}
oo=C(n-+m-,n-);
ans=(ans+oo-ff+Mod)%Mod;
ans=ans*ksm(oo,Mod-)%Mod;
Wl(ans);
return ;
}
codeforces722E的更多相关文章
- [Codeforces722E] Research Rover (dp+组合数学)
[Codeforces722E] Research Rover (dp+组合数学) 题面 给出一个N*M的方格阵,从(1,1)出发,到(N,M)结束,从(x,y)只能走到(x+1,y)或(x,y+1) ...
随机推荐
- (二)Lucene之根据关键字搜索文件
前提:在使用lucene进行搜索的时候,必须先生成索引文件,即必须先进行上一章节的案例,生成索引文件如下: 该索引文件为"segments"开头,如果没有该文件则说明没有索引文件则 ...
- 初学java1 数据类型
java数据类型 分为8种 整型 byte 8位 short 16位 int 32位 long 64位 字符型 char 必需为单引号'' 且只能有一个字符 浮点型 float double 布尔类型 ...
- Vivado问题集锦
1.添加包含子IP的模块到block design,报错如下所示: 错误的后面提供了解决方法:在tcl命令行中输入如下指令,添加子IP的xci文件即可. set_property generate_s ...
- shell取消键盘回显
使用下面这个命令取消回显 stty -echo 使用下面这个命令打开回显 stty echo
- impala 中SQL的优化方法
1.取流水表的数据时,如果是使用全部分区数据,不能从SA层数据取数,需要改从SH层取数,因为SH层为parquet存储,查询性能较好. 2.对于脚本中使用的临时表,如果存在以下情况需要进行统计表信息 ...
- golang的select实现原理剖析
写在最前面 select为golang提供了多路IO复用机制,和其他IO复用一样,用于检测是否有读写事件是否ready. 本文将介绍一下golang的select的用法和实现原理. 实现原理 gola ...
- 通过docker搭建ELK集群
单机ELK,另外两台服务器分别有一个elasticsearch节点,这样形成一个3节点的ES集群. 可以先尝试单独搭建es集群或单机ELK https://www.cnblogs.com/lz0925 ...
- SPFA找负环(DFS) luogu3385
SPFA找负环的基本思路就是如果一个点被访问两次说明成环,如果第二次访问时所用路径比第一次短说明可以通过一直跑这个圈将权值减为负无穷,存在负环 有bfs和dfs两种写法,看了一些博客,在bfs和dfs ...
- PAT Basic 1078 字符串压缩与解压 (20 分)
文本压缩有很多种方法,这里我们只考虑最简单的一种:把由相同字符组成的一个连续的片段用这个字符和片段中含有这个字符的个数来表示.例如 ccccc 就用 5c 来表示.如果字符没有重复,就原样输出.例如 ...
- Codeforces 567C - Geometric Progression - [map维护]
题目链接:https://codeforces.com/problemset/problem/567/C 题意: 给出长度为 $n$ 的序列 $a[1:n]$,给出公比 $k$,要求你个给出该序列中, ...