51nod 1486 大大走格子——dp
有一个h行w列的棋盘,里面有一些格子是不能走的,现在要求从左上角走到右下角的方案数。
单组测试数据。
第一行有三个整数h, w, n(1 ≤ h, w ≤ 10^5, 1 ≤ n ≤ 2000),表示棋盘的行和列,还有不能走的格子的数目。
接下来n行描述格子,第i行有两个整数ri, ci (1 ≤ ri ≤ h, 1 ≤ ci ≤ w),表示格子所在的行和列。
输入保证起点和终点不会有不能走的格子。
输出答案对1000000007取余的结果。
3 4 2
2 2
2 3
2
————————————————————————————
这道题如果单纯的在图上dp肯定会T嘛 因为n m 都是1e5的级别
那么我们可以考虑每一个不能走的格子 f[i]表示走到这个点不经过别的点的方案数
f[i]=c(x[i]+y[i]-2,x[i]-1)-sigma f[j]*c(x[i]-x[]j+y[i]-y[j],x[i]-x[j])
至于为什么要这么算呢 我们可以用总的路径减去不合法的路径 而每一条不合法的路径
就是先到一个点然后后面乱走嘛 这样就可以保证不算重了2333
#include<cstdio>
#include<cstring>
#include<algorithm>
#define LL long long
const int M=1e6+,mod=1e9+,N=1e5+;
int read(){
int ans=,f=,c=getchar();
while(c<''||c>''){if(c=='-') f=-; c=getchar();}
while(c>=''&&c<=''){ans=ans*+(c-''); c=getchar();}
return ans*f;
}
int n,m,p;
struct pos{int x,y;}q[M];
bool cmp(pos a,pos b){return a.x!=b.x?a.x<b.x:a.y<b.y;}
LL w[*N],inv[*N];
LL pmod(LL a,LL b){
LL ans=;
while(b){
if(b&) ans=ans*a%mod;
b>>=; a=a*a%mod;
}
return ans;
}
void prepare(){
int mx=n+m;
w[]=; for(int i=;i<=mx;i++) w[i]=w[i-]*i%mod;
inv[mx]=pmod(w[mx],mod-);
for(int i=mx;i;i--) inv[i-]=inv[i]*i%mod;
}
LL C(int n,int m){return w[n]*inv[m]%mod*inv[n-m]%mod;}
LL f[M],ans;
int main(){
//freopen("gg.cpp","r",stdin);
n=read(); m=read();
p=read(); prepare();
for(int i=;i<=p;i++) q[i].x=read(),q[i].y=read();
std::sort(q+,q++p,cmp);
for(int i=;i<=p;i++){
f[i]=C(q[i].x+q[i].y-,q[i].x-);
for(int j=;j<i;j++)
f[i]=(f[i]-f[j]*C(q[i].x-q[j].x+q[i].y-q[j].y,q[i].x-q[j].x)%mod+mod)%mod;
}
ans=C(n+m-,n-);
for(int i=;i<=p;i++) ans=(ans-f[i]*C(n-q[i].x+m-q[i].y,n-q[i].x)%mod+mod)%mod;
printf("%lld\n",(ans+mod)%mod);
return ;
}
51nod 1486 大大走格子——dp的更多相关文章
- 51nod 1486 大大走格子(容斥原理)
1486 大大走格子 题目来源: CodeForces 基准时间限制:1 秒 空间限制:131072 KB 分值: 160 难度:6级算法题 有一个h行w列的棋盘,里面有一些格子是不能走的,现在要 ...
- 51Nod 1486 大大走格子 —— 组合数学
题目链接:https://vjudge.net/problem/51Nod-1486 1486 大大走格子 题目来源: CodeForces 基准时间限制:1 秒 空间限制:131072 KB 分值: ...
- 51nod 1486 大大走格子(DP+组合数学)
枚举不合法点的思想. 把障碍x坐标为第一关键字,y坐标为第二关键字排序.f[i]表示走到第i个障碍的方案数. f[i]=C(x[i]+y[i]-2,x[i]-1)-sigma(f[j]*C(x[i]- ...
- 51nod 1486 大大走格子(容斥+dp+组合数)
传送门 解题思路 暴力容斥复杂度太高,无法接受,考虑用\(dp\).设\(f(i)\)表示从左上角开始不经过前面的阻断点,只经过\(i\)的阻断点.那么可以考虑容斥,用经过\(i\)的总方案数减去前面 ...
- 51Nod 1486 大大走格子 —— 容斥
题目:http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1486 对于每个点,求出从起点到它,不经过其他障碍点的方案数: 求一 ...
- 51nod 1486 大大走格子——容斥
题目:http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1486 已知起点到某个障碍点左上角的所有点的不经过障碍的方案数,枚举 ...
- 51 Nod 1486 大大走格子
1486 大大走格子 题目来源: CodeForces 基准时间限制:1 秒 空间限制:131072 KB 分值: 160 难度:6级算法题 收藏 关注 有一个h行w列的棋盘,里面有一些格子是不 ...
- 【51NOD】1486 大大走格子
[算法]动态规划+组合数学 [题意]有一个h行w列的棋盘,定义一些格子为不能走的黑点,现在要求从左上角走到右下角的方案数. [题解] 大概能考虑到离散化黑点后,中间的空格子直接用组合数计算. 然后解决 ...
- [51Nod1486] 大大走格子 (dp+容斥)
传送门 Description 有一个h行w列的棋盘,里面有一些格子是不能走的,现在要求从左上角走到右下角的方案数. Input 单组测试数据. 第一行有三个整数h, w, n(1 ≤ h, w ≤ ...
随机推荐
- Windows环境下的TensorFlow安装过程
安装环境 Windows8.1 python3.5.x(TensorFlow only supports version 3.5.x of Python on Windows) pip 9.0.1 t ...
- 《软件工程实践》第五次作业-WordCount进阶需求 (结对第二次)
在文章开头给出结对同学的博客链接.本作业博客的链接.你所Fork的同名仓库的Github项目地址 本作业博客链接 github pair c 031602136魏璐炜博客 031602139徐明盛博客 ...
- TCP系列26—重传—16、重组包
一.介绍 在TCP重传的时候,并没有限制TCP只能重传与初传完全相同的报文段大小,TCP允许执行重组包(repacketization),发送一个更大的TCP报文段,进而增加性能.TCP在重传时候允许 ...
- .net下将exe改造为既能双击独立运行又能注册为windows服务
最近项目中需要将一些业务的处理程序改造为windows服务,但是考虑到实际需求,也需要能够直接双击运行这些处理程序.首先第一步想到的就是原来的项目不变,只需要在加一个windows服务的项目就行.但是 ...
- .net Mvc4 View—布局页与分部页
▲ 一.Layout属性 1.1.@RenderPage():渲染制定的页面到占位符. 注意:@RenderPage()可以使用多次,这点与@RenderBody()不同 ...
- 移动端调试和fiddler移动端抓包使用
这里介绍一款移动端的调试工具以及抓包工具fiddler的使用.也是初次接触,算是初次接触的总结. 1,移动端调试工具.手机截图如下 代码实现 <!DOCTYPE html> <htm ...
- 实验吧密码学:RSAROLL
原题: {920139713,19} 704796792 752211152 274704164 18414022 368270835 483295235 263072905 459788476 48 ...
- Delphi中Self和Sender的区别
在事件处理程序参数表中,至少含有一个参数Sender,它代表触发事件处理程序的构件,如在上例中,Sender就指Button2,有了Sender参数,可以使多个构件共用相同的事件处理程序,如下例: ...
- 【EF】Entity Framework Core 2.0 特性介绍和使用指南
阅读目录 前言 获取和使用 新特性 项目升级和核心API变化 下一步计划 遗憾的地方 回到目录 前言 这是.Net Core 2.0生态生态介绍的最后一篇,EF一直是我喜欢的一个ORM框架,随着版本升 ...
- [NOI2009]管道取珠 DP + 递推
---题面--- 思路: 主要难点在思路的转化, 不能看见要求$\sum{a[i]^2}$就想着求a[i], 我们可以对其进行某种意义上的拆分,即a[i]实际上可以代表什么? 假设我们现在有两种取出某 ...