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) ...
随机推荐
- Docker相关环境全套安装文档兼小技能
Docker相关环境全套安装文档兼小技能 以下环境皆为ubuntu16.04,主要安装docker,docker-compose,docker仓库等. Docker安装 参考官方 A: 有源安装 Ub ...
- (五)CXF之添加拦截器
一.需求分析 webService中的拦截器类似于servlet的Filter过滤器.一般用于调用服务前后先调用拦截器的方法. 二.案例 本章案例是基于上一章节的基础上添加拦截器的 2.1 服务端添加 ...
- 帝国cms“建立目录不成功,请检查目录权限”的解决方法
就这个看似简单的问题我折腾了两天,百度看产生这个问题的原因有很多也很宽泛,大部分说的是初始化内置数据,但我出现“建立目录不成功,请检查目录权限”的原因估计只有少部分人会遇到. 内置初始化数据是你上传文 ...
- TensorType
- http通讯过程
- linux使用glibc版本安装mysql8.0.12
1.前言 使用yum安装虽然很方便,但是如果要是在没有公网的环境下,是没有办法使用yum源的.所以我们可以使用mysql提供的glibc版本的安装包,进行安装. 但是在安装之前,一定要将以前的版本删除 ...
- 第五章、Celery分布式系统
Celery 官方 Celery 官网:http://www.celeryproject.org/ Celery 官方文档英文版:http://docs.celeryproject.org/en/la ...
- Matplotlib介绍
目录 一. Matplotlib介绍 1 二. 初级绘制 1 1. 绘图简介 1 2. 在上面的过程中,主要就是下面三个元素: 1 三. 2D各种 ...
- Windows10关闭自动更新方法
你在为windows10自动更新而烦恼吗?下面教你一招如何关闭自动更新
- cookies, session, token
Cookie 是由客户端(通常是浏览器)保存的小型文本信息,其内容是一系列的键值对,是由 HTTP 服务器设置并保存在浏览器上的信息. 在post请求的瞬间,cookie会被浏览器自动添加到请求头中. ...