CF 560e Gerald and Giant Chess
题意:在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的更多相关文章
- CF 559C - Gerald and Giant Chess (组合计数)
\(C_{x+y}^y\)的公式,DP容斥删多余贡献. #include <cstdio> #include <iostream> #include <cstring&g ...
- 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的网格,让你 ...
- 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 ...
- Gerald and Giant Chess
Gerald and Giant Chess time limit per test 2 seconds memory limit per test 256 megabytes input stand ...
- CF559C Gerald and Giant Chess
题意 C. Gerald and Giant Chess time limit per test 2 seconds memory limit per test 256 megabytes input ...
- E. Gerald and Giant Chess
E. Gerald and Giant Chess time limit per test 2 seconds memory limit per test 256 megabytes2015-09-0 ...
- 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 ...
- 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 ...
- 【题解】CF559C C. Gerald and Giant Chess(容斥+格路问题)
[题解]CF559C C. Gerald and Giant Chess(容斥+格路问题) 55336399 Practice: Winlere 559C - 22 GNU C++11 Accepte ...
随机推荐
- showModalDialog 超过问题
a.aspx页面打开一个弹出模式对话框b.aspx. a.aspx 页面页面代码: function SetPlay() { window.showModalDialog('SetAdvertisin ...
- 【WS-Federation】到底有多少公司在用WS-Federation
到底有多少公司在用WS-Federation? sso先调用一个登录接口 获取一个token 然后再调用各种业务接口 如果是ssl token 直接暴露就行了 没有ssl 最好每次取一个token, ...
- iOS 获取手机的型号,系统版本,软件名称,软件版本
转载自:http://www.2cto.com/kf/201210/162333.html 网上搜索出来的,记录下来以后使用方便: [java]//手机序列号 NSString* ide ...
- 集成“支付宝” -b
大致步骤 1.与支付宝签约获取相关参数 合作者身份 ID 与安全校验码 key2.下载需要导入的文件,做相应设置3.在自己的项目中集成支付的方法代码 详细步骤 1.获取合作者身份 ID 与安全校验码 ...
- java程序练习:数组中随机10个数中的最大值
//定义输入:其实是一个可以保存10个整数的数组 //使用循环遍历,生成10个随机数,放入每个元素中//打桩,数组中的内容 //定义输出变量 //将数组中第一个元素取出,保存在max中,当靶子 //遍 ...
- java8 新特性
[转载]:http://www.importnew.com/11908.html 本文由 ImportNew - 刘 家财 翻译自 javacodegeeks.欢迎加入翻译小组.转载请见文末要求. 编 ...
- Matlab计算矩阵间距离
夜深人静时分,宿舍就我自己,只有蚊子陪伴着我,我慢慢码下这段文字............ 感觉知识结构不完善:上学期看论文,发现类间离散度矩阵和类内离散度矩阵,然后百度,找不到,现在学模式识别,见了, ...
- jQuery,javascript获得网页的高度和宽度
网页可见区域宽: document.body.clientWidth网页可见区域高: document.body.clientHeight网页可见区域宽: document.body.offsetWi ...
- 团体程序设计天梯赛-练习集L1-004. 计算摄氏温度
L1-004. 计算摄氏温度 时间限制 400 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 陈建海 给定一个华氏温度F,本题要求编写程序,计算对应的 ...
- "Principles of Reactive Programming" 之 <Persistent Actor State>学习笔记
这是<Pinciples of Reactive Programming>week6的最后一课. 为什么需要把actor的状态持久化? 如果actor没有状态,那么在任何实时,这个acto ...