流浪者(rover)

题目描述

有一位流浪者正在一个n∗mn∗m的网格图上流浪。初始时流浪者拥有SS点体力值。

流浪者会从(1,1)(1,1)走向(n,m)(n,m),并且他只会向下走((x,y)→(x+1,y))((x,y)→(x+1,y))或是往右走((x,y)→(x,y+1))((x,y)→(x,y+1)),在所有可行的路线中他会随机选择一条。

网络图中还有KK个障碍点。若流浪者当前体力值为SS,则他经过一个障碍点后体力值会变为⌈S2⌉⌈S2⌉。

现在请你求出,流浪者到达(n,mn,m)时他体力值的期望是多少。

若答案为abab,则你输出abab在模109+7109+7意义下的值即可。

输入

第一行四个整数n,m,K,Sn,m,K,S, 意义见题目描述。

接下来K行每行两个整数Xi,YiXi,Yi,表示一个障碍点,保证一个障碍点不会出现多次。起点与终点可能也会是障碍点。

输出

仅一行一个整数表示答案。

样例1解释

共有6种合法路径,这里不一一列出。

16∗(6+6+11+3+6+6)=19316∗(6+6+11+3+6+6)=193

约定

30%的数据:n,m≤10n,m≤10

50%的数据:n,m≤1000n,m≤1000

1000%的数据:1≤n,m≤105,0≤K≤min(n∗m,2000),1≤S≤1061≤n,m≤105,0≤K≤min(n∗m,2000),1≤S≤106


solution

slz:经典模型

我:完全不会

30:dfs

50:dp 令f[i][j][k]表示走到i j,经过k个格子的方案数

由于当k>20时对k不同对答案没有影响,最后一维可以只开20

O(nm20)

100:

dp 令f[i][j]表示当前在第i个特殊点,走到终点还会经过恰好j个特殊点的路径数

g[i][j]表示当前在第i个特殊点,走到终点还会经过小于等于j个特殊点的路径数

ways(i,j)表示i到j的路径数

从后往前dp即可

#include<cstdio>
#include<iostream>
#include<cstdlib>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<queue>
#define maxn 2005
#define mod 1000000007
#define ll long long
using namespace std;
int n,m,K,S,s[24];
ll h[200008],ny[200008],f[maxn][25],g[maxn][23];
ll work(ll a,int num){
ll ans=1;
while(num){
if(num&1)ans=ans*a;
a=a*a;a%=mod;ans%=mod;num>>=1;
}
return ans;
}
struct node{
int x,y;
}p[maxn];
bool cmp(node a,node b){
return a.x<b.x||a.x==b.x&&a.y<b.y;
}
ll C(int N,int M){
return h[N]*ny[M]%mod*ny[N-M]%mod;
}
int main()
{
cin>>n>>m>>K>>S;
int Max=200005;h[0]=1; for(int i=1;i<=Max;i++)h[i]=h[i-1]*i%mod;
ny[Max]=work(h[Max],mod-2);
for(int i=Max-1;i>=0;i--)ny[i]=ny[i+1]*(i+1)%mod;
s[0]=S;int cnt=0;
for(;s[cnt]>1;cnt++)s[cnt+1]=(s[cnt]+1)/2;
for(int i=1;i<=K;i++){
scanf("%d%d",&p[i].x,&p[i].y);
}
sort(p+1,p+K+1,cmp);
p[0].x=1;p[0].y=1;
for(int i=K;i>=0;i--){
int xi=p[i].x,yi=p[i].y;
for(int j=0;j<cnt;j++){
ll sum=0;g[i][j]=C(n-xi+m-yi,n-xi);
for(int k=K;k>i;k--){
if(p[k].y<p[i].y)continue;
int xk=p[k].x,yk=p[k].y;
sum+=f[k][j]*C(xk-xi+yk-yi,xk-xi)%mod;
sum%=mod;
}
g[i][j]-=sum;g[i][j]%=mod;
}
g[i][cnt]=C(n-xi+m-yi,n-xi);
for(int j=1;j<=cnt;j++)f[i][j]=(g[i][j]-g[i][j-1])%mod;
f[i][0]=g[i][0];
}
ll Answer=0;
for(int i=0;i<=cnt;i++){
Answer+=f[0][i]*s[i]%mod;
Answer%=mod;
}
ll All=C(n+m-2,m-1);
Answer=Answer*work(All,mod-2);
Answer=(Answer%mod+mod)%mod;
printf("%lld\n",Answer);
return 0;
}

流浪者(rover)的更多相关文章

  1. CF1010D Mars rover [位运算,DP]

    题目传送门 Mars Rover 格式难调,题面就不放了. 分析: 今天考试的时候考了这道题目的加强版,所以来做. 其实也并不难,我们建立好树形结构以后先把初始权值全部求出,然后就得到了根节点的初始值 ...

  2. codeforces 722E Research Rover

    codeforces 722E Research Rover 题意 \(1e5*1e5\)的棋盘中有\(2000\)个坏点,初始给定一个值\(s(1<=s<=1e6)\).从棋盘左上角走到 ...

  3. 【Foreign】Research Rover [DP]

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

  4. 新疆大学ACM-ICPC程序设计竞赛五月月赛(同步赛)- Red Rover

    链接:https://www.nowcoder.com/acm/contest/116/A来源:牛客网 输入描述: Input consists of a single line containing ...

  5. APM2.8 Rover 自己主动巡航车设计(固件安装和设置)

    1.2 APM2.8软件安装与固件下载 下载Mission Planner这个地面基站软件,这里介绍的是windoews平台下的,在MAC或者linux下能够使用QGroundCont基于QT编写的地 ...

  6. CF1010D Mars rover

    CF1010D Mars rover 洛谷评测传送门 题目描述 Natasha travels around Mars in the Mars rover. But suddenly it broke ...

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

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

  8. Steam 游戏 《The Vagrant(流浪者)》修改器制作-[先使用CE写,之后有时间的话改用CheatMaker](2020年寒假小目标08)

    日期:2020.02.07 博客期:146 星期五 [温馨提示]: 只是想要修改器的网友,可以直接点击此链接下载: 只是想拿CT文件的网友,可以直接点击此链接下载: 没有博客园账号的网友,可以将页面下 ...

  9. 4.2 省选模拟赛 流浪者 容斥dp

    求出期望 所有情况很好搞 C(n+m-2,n-1). 也就是说求出所有情况的和乘以上面总方案的逆元即可. 可以发现所有情况和经过多少个障碍点有关 和所处位置无关. 简单的设f[i]表示从1,1到n,m ...

随机推荐

  1. python_56_递归

    在函数内部,可以调用其他函数.如果一个函数在内部调用自身本身,这个函数就是递归函数.(最大调用自己999次) def calc(n): print(n) if int(n/2)>0: retur ...

  2. javaweb基础(32)_jdbc学习入门

    一.JDBC相关概念介绍 1.1.数据库驱动 这里的驱动的概念和平时听到的那种驱动的概念是一样的,比如平时购买的声卡,网卡直接插到计算机上面是不能用的,必须要安装相应的驱动程序之后才能够使用声卡和网卡 ...

  3. PL/SQL的安装

    一.下载PLSQLDeveloper 网址:https://www.allroundautomations.com/bodyplsqldevreg.html 还需要一个激活码 二.PL/SQL的安装 ...

  4. Uva 派 (Pie,NWERC 2006,LA 3635)

    依然是一道二分查找 #include<iostream> #include<cstdio> #include<cmath> using namespace std; ...

  5. 大蟒蛇肚子的"风暴"

    遇到了数据库连接数不足的问题,一般情况下会预留一些会话增加的情况,但在一些特殊情况下如连接风暴(logon storm), 如果在监听中没有做rate限流,对数据库来说巨大的冲击可能会导致数据库Han ...

  6. 3.Cisco Packet Tracer中关于交换机端口安全的设置

    本次实验将在这幅拓扑图的基础上完成 我们会对pc0在交换机上进行mac地址绑定,pc1访问时则交换机断开端口 1.为pc机配置ip地址 pc0:192.168.1.1 pc1:192.168.1.2 ...

  7. Laravel 命令行常用命令

    一.简介 1.Artisan 是 Laravel 自带的命令行接口名称,它为我们在开发过程中提供了很多有用的命令.想要查看所有可用的Artisan命令,可使用list命令: php artisan l ...

  8. Hive如何根据表中某个字段动态分区

    使用hive储存数据时,需要对做分区,如果从kafka接收数据,将每天的数据保存一个分区(按天分区),保存分区时需要根据某个字段做动态分区,而不是傻傻的将数据写到某一个临时目录最后倒入到某一个分区,这 ...

  9. Python9-IO模型-day41

    # 进程:启动多个进程,进程之间是由操作系统负责调用# 线程:启动多个线程,真正由被cpu执行的最小单位实际是线程# 开启一个线程,创建一个线程,寄存器.堆栈# 关闭一个线程# 协程# 本质上是一个线 ...

  10. Face The Right Way POJ - 3276 (开关问题)

    Face The Right Way Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 6707   Accepted: 312 ...