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 nmk 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

Input
3 3 2 11
2 1
2 3
Output
333333342
Input
4 5 3 17
1 2
3 3
4 1
Output
514285727
Input
1 6 2 15
1 1
1 5
Output
4

Note

In the first sample, the rover picks one of the following six routes:

  1. , after passing cell (2, 3) charge is equal to 6.
  2. , after passing cell (2, 3) charge is equal to 6.
  3. , charge remains unchanged and equals 11.
  4. , after passing cells (2, 1) and (2, 3)charge equals 6 and then 3.
  5. , after passing cell (2, 1) charge is equal to 6.
  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的更多相关文章

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

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

随机推荐

  1. Linux下如何查看tomcat是否启动、查看tomcat启动日志

    在Linux系统下,重启Tomcat使用命令的操作! 1.首先,进入Tomcat下的bin目录 cd /usr/local/tomcat/bin 使用Tomcat关闭命令 ./shutdown.sh ...

  2. MQTTnet 3.0.5学习笔记

    段时间在使用MQTTnet,都说这个东西比较好,可是翻了翻网上没有例子给参考一下. 今天算是找到了,给高手的帖子做个宣传吧. 原网址如下:https://blog.csdn.net/chenlu520 ...

  3. Linux查看进程并重启服务命令

    top -u root 查看系统进程service network restartservice iptables restartservice sshd restartservice nginx r ...

  4. Python练习_数据类型_day4

    题目 1.作业 1,写代码,有如下列表,按照要求实现每一个功能 li = ["alex", "WuSir", "ritian", " ...

  5. Julia 学习

    Julia 1.1 中文文档 Julia 中的数据可视化 --初探 一个简单的Julia教程(一) juliapro下载链接

  6. css:display:grid布局

    简介 CSS Grid布局 (又名"网格"),是一个基于二维网格布局的系统,主要目的是改变我们基于网格设计的用户接口方式.如我们所知,CSS 总是用于网页的样式设置,但它并没有起到 ...

  7. Twitter Bootstrap:前端框架利器

    Bootstrap 的文件结构 读者可以直接从 GitHub 下载到 Bootstrap 源码,本地解压后可以看到这样的目录结构:docs.img.jquery-ui- bootstrap.js 和 ...

  8. C++ 函数重载二义性

    说起函数重载,我不由得想起了C++的“多态”特性.多态又分为静态(编译时)多态和动态(运行时)多态,静态多态即为函数重载,动态多态则是虚函数机制.虚函数水较深,先不讨论,今天我们来看一下函数重载.作用 ...

  9. EventBus使用教程

    如图准备工作: 父子(子父)组件触发 EventBus.$emit('sub') EventBus.$on('sub',()=>{ console.log(1111222232211122) } ...

  10. 开源证书检查工具:fossy(fossology)

    工具下载: https://github.com/fossology/fossology 其他说明: http://archive15.fossology.org/projects/fossology ...