E. Gerald and Giant Chess
time limit per test

2 seconds

memory limit per test

256 megabytes2015-09-09

input

standard input

output

standard output

Giant chess is quite common in Geraldion. We will not delve into the rules of the game, we'll just say that the game takes place on anh × w field, and it is painted in two colors, but not like in chess. Almost all cells of the field are white and only some of them are black. Currently Gerald is finishing a game of giant chess against his friend Pollard. Gerald has almost won, and the only thing he needs to win is to bring the pawn from the upper left corner of the board, where it is now standing, to the lower right corner. Gerald is so confident of victory that he became interested, in how many ways can he win?

The pawn, which Gerald has got left can go in two ways: one cell down or one cell to the right. In addition, it can not go to the black cells, otherwise the Gerald still loses. There are no other pawns or pieces left on the field, so that, according to the rules of giant chess Gerald moves his pawn until the game is over, and Pollard is just watching this process.

Input

The first line of the input contains three integers: h, w, n — the sides of the board and the number of black cells (1 ≤ h, w ≤ 105, 1 ≤ n ≤ 2000).

Next n lines contain the description of black cells. The i-th of these lines contains numbers ri, ci (1 ≤ ri ≤ h, 1 ≤ ci ≤ w) — the number of the row and column of the i-th cell.

It is guaranteed that the upper left and lower right cell are white and all cells in the description are distinct.

Output

Print a single line — the remainder of the number of ways to move Gerald's pawn from the upper left to the lower right corner modulo109 + 7.

Sample test(s)
input
3 4 2
2 2
2 3
output
2
input
100 100 3
15 16
16 15
99 88
output
545732279

我们对着2000个点离(1,1)点的距离进行排序;
dp[i] 表示 从11点没有经过黑点到达i的方案数
dp[i]=C(x+y-2,y-1)-(dp[j]*C(x-x1+y-y1,x-x1))
#include <iostream>
#include <algorithm>
#include <cstdio>
#include <string.h>
#include <vector>
using namespace std;
const int maxn=+;
typedef long long LL;
const LL mod=;
LL dp[maxn];
struct point{
int x,y;
bool operator < (const point &rhs) const
{
return (x+y)<(rhs.x+rhs.y);
}
}P[maxn];
LL fax[*];
void init()
{
int n=*;
fax[]=;
for(int i=; i<=n; i++)
fax[i]=(fax[i-]*i)%mod;
}
void gcd(LL a, LL b, LL &d, LL &x, LL &y)
{
if(b==){
d=a; x=;y=;
}else {
gcd(b,a%b,d,y,x); y-=x*(a/b);
}
}
LL inv(LL a,LL n)
{
LL d,x,y;
gcd(a,n,d,x,y);
return (x+n)%n;
}
LL lucas(int n,int m)
{
LL ans=;
while(n&&m)
{
int a=n%mod,b=m%mod;
if(a<b)return ;
ans= ( ( ( ans * fax[a] )%mod )* inv(fax[b]*fax[a-b],mod) ) %mod;
n/=mod ; m/=mod;
}
return ans;
}
int main()
{
int h,w,n;
init();
while(scanf("%d%d%d",&h,&w,&n)==)
{
for(int i=; i<n; i++)
{
scanf("%d%d",&P[i].x,&P[i].y);
}
P[n].x=h;P[n].y=w;
sort(P,P+n+); for(int i=; i<=n; i++)
{
dp[i]=lucas(P[i].x+P[i].y-,P[i].y-);
for(int j=; j<i; j++)
if(P[i].x>=P[j].x&&P[i].y>=P[j].y)
{
dp[i]= ( ( dp[i] - ( dp[j]*lucas(P[i].x-P[j].x+P[i].y-P[j].y ,P[i].x-P[j].x ) )%mod)+mod)%mod;
}
}
printf("%I64d\n",dp[n]);
} return ;
}

2015-09-09---opas


E. Gerald and Giant Chess的更多相关文章

  1. dp - Codeforces Round #313 (Div. 1) C. Gerald and Giant Chess

    Gerald and Giant Chess Problem's Link: http://codeforces.com/contest/559/problem/C Mean: 一个n*m的网格,让你 ...

  2. CodeForces 559C Gerald and Giant Chess

    C. Gerald and Giant Chess time limit per test 2 seconds memory limit per test 256 megabytes input st ...

  3. Gerald and Giant Chess

    Gerald and Giant Chess time limit per test 2 seconds memory limit per test 256 megabytes input stand ...

  4. CF559C Gerald and Giant Chess

    题意 C. Gerald and Giant Chess time limit per test 2 seconds memory limit per test 256 megabytes input ...

  5. Codeforces Round #313 (Div. 1) C. Gerald and Giant Chess DP

    C. Gerald and Giant Chess Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/contest ...

  6. codeforces(559C)--C. Gerald and Giant Chess(组合数学)

    C. Gerald and Giant Chess time limit per test 2 seconds memory limit per test 256 megabytes input st ...

  7. 【题解】CF559C C. Gerald and Giant Chess(容斥+格路问题)

    [题解]CF559C C. Gerald and Giant Chess(容斥+格路问题) 55336399 Practice: Winlere 559C - 22 GNU C++11 Accepte ...

  8. Codeforces Round #313 (Div. 1) C. Gerald and Giant Chess

    这场CF又掉分了... 这题题意大概就给一个h*w的棋盘,中间有一些黑格子不能走,问只能向右或者向下走的情况下,从左上到右下有多少种方案. 开个sum数组,sum[i]表示走到第i个黑点但是不经过其他 ...

  9. Codeforces Round #313 (Div. 2) E. Gerald and Giant Chess (Lucas + dp)

    题目链接:http://codeforces.com/contest/560/problem/E 给你一个n*m的网格,有k个坏点,问你从(1,1)到(n,m)不经过坏点有多少条路径. 先把这些坏点排 ...

随机推荐

  1. 《Redis 持久化》

    一:什么是持久化?    - Redis 是内存级别的数据库.所谓持久化,即把数据(如内存中的对象)保存到可永久保存的存储设备中(如磁盘)中. - 可以持久读取操作等的数据. - Redis 支持 R ...

  2. django--验证码功能实现

    首先建立验证码的视图函数1需要安装pillow库 #导入绘图库 from PIL import ImageDraw #导入绘图字体库 from PIL import ImageFont #导入图片库 ...

  3. java之String类在堆栈存储机制

    String类是一个比较特殊的类,最主要的体现是它有多种创建形式,例如,String a ="abc";Sting a=new("abc");表面上看得到的结果 ...

  4. C语言编程中pid, tid以及真实pid的关系(转)

    add by zhj: 下面是我对pid,tgid,ppid的个人理解 对于ubuntu14.04操作系统,可以在/usr/src/linux-headers-4.4.0-31/include/lin ...

  5. JavaScript indexOf() 方法

    定义和用法 indexOf() 方法可返回某个指定的字符串值在字符串中首次出现的位置. 语法 stringObject.indexOf(searchvalue,fromindex) 说明 该方法将从头 ...

  6. 配置svn用户及密码

    配置账户及密码   格式: user=passwd 配置新的账户 [root@mysql conf]# vim passwd 创建两个账户 [root@mysql conf]# egrep -v &q ...

  7. 数据库——MongoDB增删改查

    MongoDB增删改查操作 本文包含对数据库.集合以及文档的基本增删改查操作 数据库操作 #1.增 use config #如果数据库不存在,则创建并切换到该数据库,存在则直接切换到指定数据库. #2 ...

  8. vue-filter

  9. 为什么char *name="it",printf("%s",name) 能够输出字符串?

    “it”里面是3个字符  “i”“t”“/0”,%s会打印指针指向的字符就是“i”,知道遇到“/0”停止,所以打印出来是“it”

  10. docker的容器和镜像的差别