C. Gerald and Giant Chess
time limit per test

2 seconds

memory limit per test

256 megabytes

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

题目大意:给出一个棋盘为h*w,如今要从(1,1)到(h,w)。当中有n个黑点不能走,问有多少种可能从左上到右下(1,1和h,w永远是能够走的)

计算左上到右下的方法假设不考虑黑点的话,sum=C(h+w)(h)

由于存在黑点i(x,y),所以用所以计算从左上到黑点的方法有sum[i] = C(x+y)(x)。当中假设在黑点的左上还有黑点j(u,v),那么应该减去sum[j]*C(x-u+y-v)(y-u)。去掉全部在左上的黑点的影响就能够得到由左上到第i点的真正的方法数

从左上的第一个黑点。一直计算到右下(h,w)

注意:

1、C(h+w)(h)的数据非常大。C(h+w)(h) = (h+w)!/( h!*w! )。用数组fac记录下每一个数的阶乘

2、计算组合数的时候有除法,能够用逆元来做a/b%mod = a*(b^(mod-2))%mod。计算i的阶乘的逆元inv[i],第在对阶乘求逆元的方法还有inv[ fac[i] ] = inv[ fac[i+1] ]*(i+1)%mod ,这种方法仅对连续的阶乘有效。

#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std ;
#define LL __int64
const LL MOD = 1e9+7 ;
struct node{
LL x , y ;
}p[3100];
LL h , w , n ;
LL fac[310000] , inv[310000] ;
LL sum[3100] ;
int cmp(node a,node b) {
return a.x < b.x || (a.x == b.x && a.y < b.y) ;
}
LL pow(LL x,LL k) {
LL ans = 1 ;
while( k ) {
if( k&1 ) ans = ans*x%MOD ;
k = k>>1 ;
x = (x*x)%MOD ;
}
return ans ;
}
void init() {
LL i , j , c ;
fac[0] = inv[0] = 1 ;
for(i = 1 ; i <= h+w ; i++)
fac[i] = (fac[i-1]*i)%MOD ;
c = max(h,w) ;
inv[c] = pow(fac[c],MOD-2) ;
for(i = c-1 ; i > 0 ; i--) {
inv[i] = inv[i+1]*(i+1)%MOD ;
}
}
int main() {
LL i , j ;
LL ans ;
while( scanf("%I64d %I64d %I64d", &h, &w, &n) != EOF ) {
init() ;
for(i = 0 ; i < n ; i++)
scanf("%I64d %I64d", &p[i].x, &p[i].y) ;
p[n].x = h ; p[n++].y = w ;
sort(p,p+n,cmp) ;
int x1 , y1 , x2 , y2 ;
for(i = 0 ; i < n ; i++) {
x1 = p[i].x-1 ; y1 = p[i].y-1 ;
sum[i] = fac[x1+y1]*inv[x1]%MOD*inv[y1]%MOD ;
for(j = 0 ; j < i ; j++) {
if( p[j].x <= p[i].x && p[j].y <= p[i].y ) {
x2 = x1 - p[j].x+1 ; y2 = y1 - p[j].y+1 ;
sum[i] = (sum[i]-fac[x2+y2]*inv[x2]%MOD*inv[y2]%MOD*sum[j]%MOD)%MOD ;
if( sum[i] <= 0 ) sum[i] = (sum[i]+MOD)%MOD;
}
}
}
printf("%I64d\n", sum[n-1]) ;
}
return 0 ;
}

codeforces(559C)--C. Gerald and Giant Chess(组合数学)的更多相关文章

  1. 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 ...

  2. 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的网格,让你 ...

  3. 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 ...

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

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

  5. Gerald and Giant Chess

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

  6. CF559C Gerald and Giant Chess

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

  7. E. Gerald and Giant Chess

    E. Gerald and Giant Chess time limit per test 2 seconds memory limit per test 256 megabytes2015-09-0 ...

  8. Codeforces 559C Gerald and Giant Chess【组合数学】【DP】

    LINK 题目大意 有一个wxh的网格,上面有n个黑点,问你从(1,1)走到(w,h)不经过任何黑点的方案数 思路 考虑容斥 先把所有黑点按照x值进行排序方便计算 \(dp_{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. Linux、CentOS系统下调整home和根分区大小

    1.首先查看磁盘使用情况 [root@localhost ~]# df -h 文件系统 容量 已用 可用 已用% 挂载点 Filesystem Size Used Avail Use% Mounted ...

  2. 使用unity3d开发app

    做过一些项目,参入过一些项目的计划安排.总觉得一些工具用起来很麻烦,要么是要收费,要么很大很重.没有针对小团队的简单易用的任务管理工具,也可能是找了些不能适合自己的习惯. 所有准备开始自己开发一款项目 ...

  3. MyEclipse中快捷键

    ------------------------------------- MyEclipse 快捷键1(CTRL) ------------------------------------- Ctr ...

  4. 2017.10.25 es-sql分页无效

    1.问题描述 使用es-sql聚合查询时,发现无法进行分页操作. 结果为16条: 当使用limit语法进行分页之后,发现并没有效果(以取5条记录为一页为例). 首先查询前5条记录: 返回的记录如下图: ...

  5. MPTCP 源码分析(二) 建立子路径

    简述      MPTCP在进行三次握手之后,客户端和服务端会进行地址信息的交换,让对方知道彼此未用的地址信息. 当客户端知道服务端的地址后就可以建立其他子路径.三次握手和建立子路径的过程如图1:   ...

  6. Django——如何在Django模板中注入全局变量?——part2

    模版中的变量由context中的值来替换,如果在多个页面模版中含有相同的变量,比如:每个页面都需要{{user}},笨办法就是在每个页面的请求视图中都把user放到context中.   from d ...

  7. BZOJ 1016 JSOI 2008 最小生成树计数 Kruskal+搜索

    题目大意:给出一些边,求出一共能形成多少个最小生成树. 思路:最小生成树有非常多定理啊,我也不是非常明确.这里仅仅简单讲讲做法.关于定各种定理请看这里:http://blog.csdn.net/wyf ...

  8. 【DB2】DB2中rank(),dense_rank(),row_number()的用法

    1.准备测试数据 DROP TABLE oliver_1; ),SUB_NO ),SCORE int); ,,); ,,); ,,); ,,); ,,); ,,); 2.详解rank(),dense_ ...

  9. 导入解析excel小结

    导入解析excel小结 控制器例子:

  10. 动态加载script 和 link

    1.script EventUtil.addHandler(window, "load", function(event){ var script = document.creat ...