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) ...
随机推荐
- XML和JSON序列化以及反序列化
1.将文件保存序列化至文档中,然后再读取: //首先创建可序列化的实体类 [Serializable] public class Message { public string Name { get; ...
- ES6语法 学习
ECMAScript 6,也被称为ECMAScript 2015是ECMAScript标准的最新版本.6是语言的一个重要更新,并第一次更新语言由于ES5 2009标准.现在主要JavaScript引擎 ...
- 查看flask中所有的路由信息(同时查看/设置允许的请求方式get、post)
查看flask中所有的路由信息(同时查看/设置允许的请求方式get.post) # -*- coding: utf-8 -*- from flask import Flask app = Flask( ...
- vim调试Shell脚本: unexpected EOF while looking for matching
往往在编写脚本完后测试,出现错误需要调试,vim 是一种强大的文本编辑器,对调试也很有帮助.如果指定用不同的颜色显示某些错误,通过配置 .vimrc 文件就会替您完成大部分调试工作. 小柏在测试脚本时 ...
- COM_STMT_PREPARE 1
mysqld_stmt_prepare void mysqld_stmt_prepare(THD* thd, const char * query, uint length, Prepared_sta ...
- 【Jenkins】修改Ubuntu下的jenkins端口号
jenkins安装目录:/var/lib/jenkins jenkins日志目录:/var/log/jenkins/jenkins.logjenkins默认配置:/etc/default/jenkin ...
- 通过字节码分析Java异常处理机制
在上一次[https://www.cnblogs.com/webor2006/p/9691523.html]初步对异常表相关的概念进行了了解,先来回顾一下: 其源代码也贴一下: 下面来看一下jclas ...
- Leet爬楼梯问题
假设你正在爬楼梯.需要 n 阶你才能到达楼顶. 每次你可以爬 1 或 2 个台阶.你有多少种不同的方法可以爬到楼顶呢? 注意:给定 n 是一个正整数. 示例 1: 输入: 2输出: 2解释: 有两种方 ...
- mysql init password centos
https://www.cnblogs.com/FlyingPuPu/p/7783735.html
- 标准库heapq的使用
转载自: https://blog.csdn.net/y472360651/article/details/80725355 查找最大或最小的N个元素 怎么样从一个列表中取出最大或最小的N个元素的列表 ...