题意:在h×w的棋盘中从左上角走到右下角,只能向右或向下走,有n个点不可以经过,一共有多少种方案。

解法:dp。先对点按横坐标排序(横坐标相等按纵坐标,也可以反过来)dp[i]表示不经过其他非法点走到第i个非法点的路径数,则有dp方程:dp[i] = c(point[i].x + point[i].y - 2, point[i].x - 1) - Σj = 0...i - 1 dp[j] * c(point[i].x - point[j].x + point[i].y - point[j].y, point[i].x - point[j].x),c表示组合数,c(point[i].x + point[i].y - 2, point[i].x - 1)表示从起点到该非法点i的所有路径,再减去在该点之前的每个点j,从起点到点j的路径数乘以从点j到点i的路径数,即为所求,将终点加入点集中,则dp[n]为答案。

而对于组合数的求法,这道题无法用杨辉三角打表,所以用阶乘来求,即c(n, m) = n! / (m! * (n - m)!),但由于有取模运算,不能直接做除法,所以转化为乘以分母的逆元,m = n mod p的逆元为mp-2

代码:

#include<stdio.h>
#include<iostream>
#include<algorithm>
#include<string>
#include<string.h>
#include<math.h>
#include<limits.h>
#include<time.h>
#include<stdlib.h>
#include<map>
#include<queue>
#include<set>
#include<stack>
#include<vector>
#define LL long long
using namespace std;
struct node
{
LL x, y;
bool operator < (const node &tmp) const
{
if(x == tmp.x)
return y < tmp.y;
return x < tmp.x;
}
}point[2005];
const LL mod = 1e9 + 7;
LL jc[200005];//阶乘
void init()
{
jc[0] = 1;
for(int i = 1; i < 200005; i++)
{
jc[i] = (jc[i - 1] * i) % mod;
}
}
LL Pow(LL n)//求逆元
{
n %= mod;
LL x = 1e9 + 5;
LL res = 1;
while(x)
{
if(x & 1)
res = res * n % mod;
n = n * n % mod;
x >>= 1;
}
return res;
}
LL c(int x, int y)
{
if(x < 0)
return 0;
if(y < 0)
return 0;
if(y > x)
return 0;
//不判断以上三个条件会RE
return jc[x] * Pow(jc[y] * jc[x - y] % mod) % mod;
}
LL dp[2005];
int main()
{
init();
int h, w, n;
while(~scanf("%d%d%d", &h, &w, &n))
{
memset(dp, 0, sizeof dp);
for(int i = 0; i < n; i++)
{
cin >> point[i].x >> point[i].y;
}
point[n].x = h, point[n].y = w;
sort(point, point + n);
LL ans = 0;
for(int i = 0; i <= n; i++)
{
LL tmp = c(point[i].x + point[i].y - 2, point[i].x - 1);
for(int j = 0; j < i; j++)
{
tmp += mod - (dp[j] * c(point[i].x - point[j].x + point[i].y - point[j].y, point[i].x - point[j].x) % mod);
tmp %= mod;
}
dp[i] = tmp;
}
cout << dp[n] << endl;
}
return 0;
}

 CF不能交lld真蛋疼……

CF 560e Gerald and Giant Chess的更多相关文章

  1. CF 559C - Gerald and Giant Chess (组合计数)

    \(C_{x+y}^y\)的公式,DP容斥删多余贡献. #include <cstdio> #include <iostream> #include <cstring&g ...

  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 559C Gerald and Giant Chess

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

  4. Gerald and Giant Chess

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

  5. CF559C Gerald and Giant Chess

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

  6. E. Gerald and Giant Chess

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

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

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

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

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

随机推荐

  1. UITableViewCell 重合问题解决方法

    这两天做ios遇到一个UITableViewCell 数据重合的问题,原因:引起这个问题的主要原因是,重用cell.之前cell上的内容未被清空,而又增加新增内容所致.从网上查了一些解决方法,比如: ...

  2. Integer自动装箱分析

    先看看下面的代码会输出什么: public static void main(String[] args) { Integer i = 127; Integer j = 128; Integer ii ...

  3. SVN弱密码扫描(Python)

    寂寞如雪的用脑过度,所以来写个博客分享一下.#虽然上一篇博客我还没写完 SVN的弱密码,看起来很复杂,但实际上很简单啊= =虽然不像pymssql/mymssql这种,Python提供了很好用的包,但 ...

  4. python学习笔记13(模块、包)

    在Python中有一个概念叫做模块(module),比如在Python中要调用sqrt函数,必须用import关键字引入math这个模块,下面就来了解一下Python中的模块. 模块文件以.py后缀结 ...

  5. JPA2 关于 PagingAndSortingRepository

    And --- 等价于 SQL 中的 and 关键字,比如 findByUsernameAndPassword(String user, Striang pwd): Or --- 等价于 SQL 中的 ...

  6. spoj 362

    规律还是比较好找的  大数除法 #include <cstdio> #include <cstring> int len,a[1000],q; int cc[] = {0,1, ...

  7. Nagios : Verifying Your Configuration

    Every time you modify your configuration files, you should run a sanity check on them. It is importa ...

  8. Why does yum return error: [Errno 256] No more mirrors to try ?

    https://access.redhat.com/solutions/203603 ISSUE yum update fails with the error : [Errno 256] No mo ...

  9. Java在Windows的环境配置

    JDK环境变量配置的步骤如下: 1.我的电脑-->属性-->高级-->环境变量. 2.配置用户变量: 系统变量 a.新建 JAVA_HOME C:\Program Files\Jav ...

  10. NPOI.dll学习

    NPOI 是 POI 项目的 .NET 版本.POI是一个开源的Java读写Excel.WORD等微软OLE2组件文档的项目. 简介 编辑 使用 NPOI 你就可以在没有安装 Office 或者相应环 ...