有一个h行w列的棋盘,里面有一些格子是不能走的,现在要求从左上角走到右下角的方案数。

Input

单组测试数据。 
第一行有三个整数h, w, n(1 ≤ h, w ≤ 10^5, 1 ≤ n ≤ 2000),表示棋盘的行和列,还有不能走的格子的数目。 
接下来n行描述格子,第i行有两个整数ri, ci (1 ≤ ri ≤ h, 1 ≤ ci ≤ w),表示格子所在的行和列。 
输入保证起点和终点不会有不能走的格子。

Output

输出答案对1000000007取余的结果。

Sample Input

3 4 2
2 2
2 3

Sample Output

2

题目链接 

分析
从左上角(1,1)走到(x,y)的方案数为C(x-1+y-1,x-1)。设d[i]为到达第i个黑点且中间不经过任何黑点的方案数。则有d[i]=C(xi+yi-2,xi-1)-
d[j]*C(xi+yi-xj-yj,xi-yi)(xj<xi,yj<yi).然后令第n+1个黑点为(h,w),答案即为d[n+1]。为什么这样是正确的呢?
对于一个黑点,可能可以由另外的黑点到达。实际上枚举时总是从第一个能经过的黑点出发,每个黑点会对目的黑点的值有影响,
贡献为该黑点的值乘上从该黑点走到目的黑点的方案数。(因为只要经过黑点就是非法的,所以后面没有限制,直接走就好了)
#include <iostream>
#include <cstdio>
#include <cmath>
#include <cstring>
#include <algorithm>
#include <map>
#include <vector>
typedef long long LL;
const int maxn = 2e5+;
const int inf = 0x3f3f3f3f;
const int mod = ;
using namespace std; LL fact[maxn],inv[maxn];
struct node{
int x,y;
}p[];
LL _inv(int x){
if(x==) return ;
return (mod-mod/x)*_inv(mod%x)%mod;
}
void init(){
fact[]=;
for(int i=;i<maxn;i++){
fact[i]=(fact[i-]*i)%mod;
}
for(int i=;i<maxn;i++){
inv[i]=_inv(fact[i]);
}
}
LL C(int a,int b){
if(a<b) return ;
return ((fact[a]*inv[b])%mod*inv[a-b])%mod;
}
int cmp(node a,node b){
if(a.x==b.x) return a.y<b.y;
return a.x<b.x;
}
LL d[]; int main(){
#ifdef LOCAL
freopen("in.txt","r",stdin);
#endif
init(); int h,w,n;
scanf("%d%d%d",&h,&w,&n); for(int i=;i<n;i++)
scanf("%d%d",&p[i].x,&p[i].y); sort(p,p+n,cmp);
p[n].x=h,p[n].y=w;
n++; for(int i=;i<n;i++){
d[i]=C(p[i].x+p[i].y-,p[i].x-);
for(int j=;j<i;j++){
if(p[i].y>=p[j].y&&p[i].x>=p[j].x){
d[i] -= (d[j]*C(p[i].x+p[i].y-p[j].x-p[j].y,p[i].x-p[j].x))%mod;
if(d[i]<){
d[i]+=mod;
}
}
}
}
cout<<d[n-];
return ;
}

51NOD-1486 大大走格子的更多相关文章

  1. 51nod 1486 大大走格子(容斥原理)

    1486 大大走格子 题目来源: CodeForces 基准时间限制:1 秒 空间限制:131072 KB 分值: 160 难度:6级算法题   有一个h行w列的棋盘,里面有一些格子是不能走的,现在要 ...

  2. 51Nod 1486 大大走格子 —— 组合数学

    题目链接:https://vjudge.net/problem/51Nod-1486 1486 大大走格子 题目来源: CodeForces 基准时间限制:1 秒 空间限制:131072 KB 分值: ...

  3. 51Nod 1486 大大走格子 —— 容斥

    题目:http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1486 对于每个点,求出从起点到它,不经过其他障碍点的方案数: 求一 ...

  4. 51nod 1486 大大走格子——dp

    有一个h行w列的棋盘,里面有一些格子是不能走的,现在要求从左上角走到右下角的方案数. Input 单组测试数据. 第一行有三个整数h, w, n(1 ≤ h, w ≤ 10^5, 1 ≤ n ≤ 20 ...

  5. 51nod 1486 大大走格子——容斥

    题目:http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1486 已知起点到某个障碍点左上角的所有点的不经过障碍的方案数,枚举 ...

  6. 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]- ...

  7. 51nod 1486 大大走格子(容斥+dp+组合数)

    传送门 解题思路 暴力容斥复杂度太高,无法接受,考虑用\(dp\).设\(f(i)\)表示从左上角开始不经过前面的阻断点,只经过\(i\)的阻断点.那么可以考虑容斥,用经过\(i\)的总方案数减去前面 ...

  8. 51 Nod 1486 大大走格子

    1486 大大走格子  题目来源: CodeForces 基准时间限制:1 秒 空间限制:131072 KB 分值: 160 难度:6级算法题  收藏  关注 有一个h行w列的棋盘,里面有一些格子是不 ...

  9. 【51NOD】1486 大大走格子

    [算法]动态规划+组合数学 [题意]有一个h行w列的棋盘,定义一些格子为不能走的黑点,现在要求从左上角走到右下角的方案数. [题解] 大概能考虑到离散化黑点后,中间的空格子直接用组合数计算. 然后解决 ...

  10. 51nod 1486

    http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1486 1486 大大走格子 题目来源: CodeForces 基准时间限 ...

随机推荐

  1. 关于js中this指向的理解总结!

    关于js中this指向的理解! this是什么?定义:this是包含它的函数作为方法被调用时所属的对象. 首先,this的指向在函数定义的时候是确定不了的,只有函数执行的时候才能确定this到底指向谁 ...

  2. docker 构建dockerfile

    版本为: 使用cenotos 7 docker  版本 [root@zhao ~]# docker --versionDocker version 17.03.1-ce, build c6d412e ...

  3. scope 前缀开头的方法

    https://learnku.com/docs/laravel/5.6/eloquent/1403 本地范围 本地范围允许定义通用的约束集合以便在应用中复用. 例如, 你可能经常需要获取「受欢迎的」 ...

  4. Jenkins之Linux和window配置区别

    一.命令行配置 windows: java -jar .\libs\gen-html-report-1.0-SNAPSHOT.jar .\reports_%BUILD_NUMBER%.html .\t ...

  5. 核化主成分分析(Kernel PCA)应用及调参

    核化这个概念在很多机器学习方法中都有应用,如SVM,PCA等.在此结合sklearn中的KPCA说说核函数具体怎么来用. KPCA和PCA都是用来做无监督数据处理的,但是有一点不一样.PCA是降维,把 ...

  6. IDEA 快捷键修改(长期更新)

    最近误操作,导致idea的快捷键没了. 痛定思痛,打算记录一下,以前修改过的key map 搜索一下就好了: 1  代码格式化 -- reformat code:Ctrl+Alt+L(如果按了没反应, ...

  7. Maven依赖中的scope详解

    scope的分类 compile 默认就是compile,什么都不配置也就是意味着compile.compile表示被依赖项目需要参与当前项目的编译,当然后续的测试,运行周期也参与其中,是一个比较强的 ...

  8. 洛谷P2900 [USACO08MAR]土地征用Land Acquisition(动态规划,斜率优化,决策单调性,线性规划,单调队列)

    洛谷题目传送门 用两种不一样的思路立体地理解斜率优化,你值得拥有. 题意分析 既然所有的土地都要买,那么我们可以考虑到,如果一块土地的宽和高(其实是蒟蒻把长方形立在了平面上)都比另一块要小,那么肯定是 ...

  9. SVM学习笔记-线性支撑向量机

    对于PLA算法来说,最终得到哪一条线是不一定的,取决于算法scan数据的过程. 从VC bound的角度来说,上述三条线的复杂度是一样的 Eout(w)≤Ein0+Ω(H)dvc= ...

  10. 自学Zabbix4.2 web监控项创建+item详解

    自学Zabbix4.2 web监控项创建+item详解 1. web监控项创建 1.1  Scenario 选项卡 Name: 监控项的名称 Application: 放到哪个应用中 Authenti ...