Gerald and Giant Chess

题意:
给你一个 h × w h\times w h×w的网格和 n n n个黑点,问你从 ( 1 , 1 ) (1, 1) (1,1)到 ( h , w ) (h, w) (h,w)且不经过那 n n n个黑点的方案数,你只能向下或者向右走,答案对 1 0 9 + 7 10^9+7 109+7取模。

分析:
首先我们分析没有一个黑点的方案数,即我们只需要向下走 h − 1 h-1 h−1步,向右走 w − 1 w - 1 w−1步。那么也就是在这 h + w − 2 h + w - 2 h+w−2步中我们选择 h − 1 h - 1 h−1步向下走,即方案数为 C h + w − 2 h − 1 C_{h + w - 2}^{h - 1} Ch+w−2h−1​。
然后我们排除掉经过那 n n n个黑点的方案数,这时我们可能会想到用容斥原理,即:
r e s = C h + w − 2 h − 1 − P 1 + P 2 − P 3 + . . . + ( − 1 ) n P n \large res = C_{h + w - 2}^{h - 1} - P_1 + P_2 - P_3 + ... + (-1)^nP_n res=Ch+w−2h−1​−P1​+P2​−P3​+...+(−1)nPn​。
但是我们 n n n的范围是 n ≤ 2000 n \le 2000 n≤2000的,所以直接用容斥原理不可取。因为容斥原理的复杂度为 O ( 2 n ) O(2^n) O(2n)。
通过上面的分析我们可以进一步优化,我们设 d p i dp_i dpi​表示从 ( 1 , 1 ) (1, 1) (1,1)走到第 i i i个黑点,且不经过其他黑点的方案数。
那么有: d p i = C x i + y i − 2 x i − 1 − ∑ j = 1 i − 1 d p i × C x i − x j + y i − y j x i − x j \large dp_i = C_{x_i + y_i - 2}^{x_i - 1} - \sum_{j = 1}^{i - 1}dp_i\times C_{xi - x_j + y_i - y_j}^{x_i - x_j} dpi​=Cxi​+yi​−2xi​−1​−∑j=1i−1​dpi​×Cxi−xj​+yi​−yj​xi​−xj​​
不理解的可以画一下图,很直观。
然后我们这题就能写出来了,在这之前我们还要先把黑点进行排序,因为我们看这个 d p dp dp公式可以发现,转移方程和黑点的下标顺序有关。
我们将 ( h , w ) (h, w) (h,w)可以看作是第 n + 1 n + 1 n+1个黑点,所以代码如下:

#include <bits/stdc++.h>#define fi first
#define se second
using namespace std;
typedef long long ll;
typedef pair<int, int> PII;
const int MOD = 1e9 + 7;
const int maxn = 1e6 + 5;ll qpow(ll a, ll b, ll mod) {ll res = 1;while (b) {if (b & 1) res = res * a % mod;a = a * a % mod;b >>= 1;}return res;
}ll fac[maxn], inv[maxn];void init(int n) {fac[0] = 1;for (int i = 1; i <= n; i++) fac[i] = fac[i - 1] * i % MOD;inv[n] = qpow(fac[n], MOD - 2, MOD);for (int i = n - 1; i >= 0; i--) inv[i] = inv[i + 1] * (i + 1) % MOD;
}ll C(int n, int m) {if (n < m) return 0;return fac[n] * inv[m] % MOD * inv[n - m] % MOD;
}PII p[maxn];
ll dp[maxn];int main() {int h, w, n;scanf("%d%d%d", &h, &w, &n);for (int i = 1; i <= n; i++) scanf("%d%d", &p[i].fi, &p[i].se);n++;p[n].fi = h, p[n].se = w;sort(p + 1, p + n + 1);init(max(h, w) << 1);for (int i = 1; i <= n; i++) {dp[i] = C(p[i].fi + p[i].se - 2, p[i].fi - 1);for (int j = 1; j < i; j++) {dp[i] = ((dp[i] - dp[j] * C(p[i].fi + p[i].se - p[j].fi - p[j].se, p[i].fi - p[j].fi) % MOD) % MOD + MOD) % MOD;}}printf("%lld\n", dp[n]);return 0;
}

[CF559C] Gerald and Giant Chess相关推荐

  1. cf559C. Gerald and Giant Chess(容斥原理)

    题意 $h \times w$的网格,有$n$个障碍点, 每次可以向右或向下移动 求从$(1, 1)$到$(h, w)$不经过障碍点的方案数 Sol 容斥原理 从$(1, 1)$到$(h, w)$不经 ...

  2. 数论五之容斥——硬币购物,Gerald and Giant Chess,幸运数字,Sky Full of Stars,已经没有什么好害怕的了

    容斥的神 [HAOI2008]硬币购物 problem solution code CF559C Gerald and Giant Chess problem solution code [SCOI2 ...

  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. CodeForces - 560E Gerald and Giant Chess(组合数学+dp)

    题目链接:点击查看 题目大意:给出一个 n∗mn*mn∗m 的矩阵,其中有 kkk 个坏点,每次只能向右走或向下走,问从点 (1,1)(1,1)(1,1) 到点 (n,m)(n,m)(n,m) 共有多 ...

  5. CF559C-Gerald and Giant Chess【计数类dp】

    正题 上不了Codeforces,就用洛谷了 评测记录:https://www.luogu.org/recordnew/lists?uid=52918&pid=CF559C 题目大意 H∗WH ...

  6. CF刷题(03)——难度2100~2400

    这个博客记录2100到2400共17个题 2100 1.B. Maximum Value 题意:You are given a sequence a consisting of nnn integer ...

  7. opencv国际象棋_国际象棋是的

    opencv国际象棋 By Kellen Browning 凯伦·布朗宁 On a recent afternoon, thousands of noncombatants watched from ...

  8. HDU 6114 Chess 【组合数】(2017百度之星程序设计大赛 - 初赛(B))

    Chess Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Subm ...

  9. hdu-5794 A Simple Chess(容斥+lucas+dp)

    题目链接: A Simple Chess Time Limit: 2000/1000 MS (Java/Others)     Memory Limit: 65536/65536 K (Java/Ot ...

最新文章

  1. Redis 笔记(01)— 安装、启动配置、开启远程连接、设置密码、远程连接
  2. AntiXSS - 支持Html同时防止XSS攻击
  3. 史上更全面的数据库分库分表、数据一致性、主键分配思路!
  4. Android studio 中引用jar的其实是Maven?(一)
  5. 深度探索C++ 对象模型(4)-Default Copy Constructor(4)
  6. 关于OSI七层模型详细解释
  7. 文本过滤后返回空值_利用Fiddler来Mock接口返回值
  8. Objective-C超高精度的计时器
  9. 调多线程中的消息发送
  10. VB.NET2005通过泛型实现的KMP查找算法
  11. 微信小程序获取用户的头像和昵称
  12. 【BZOJ1226】学校食堂(动态规划,状态压缩)
  13. lwj_C#_周总结1
  14. LeetCode Top 100 Liked Questions 416. Partition Equal Subset Sum (Java版; Medium)
  15. echarts设置饼图标示线以及标示文字的颜色等相关样式
  16. 校园共享单车停放问题的调研
  17. RobotFramework(RF)常用函数库-内置库篇
  18. 世界人工智能大会即将举办 AI机器人帮你分类垃圾
  19. Windows 组策略 应用
  20. JAVA操作xml文件

热门文章

  1. 嵌入式linux学习笔记--使用wget下载文件
  2. Black Hat 2008 观察第一天
  3. 19. Fight over Fox-hunting 猎狐引发的冲突
  4. 如何使用密码限制对PlayStation 4的访问
  5. 梅宫主:创业小白精准引流之——布局自动化引流系统三大绝招!
  6. 我的深圳面试体验--艾默生/西门子/华为/中兴/索尼/富士施乐/长城国际/ 马士基/SGS/宜家/
  7. python log日志模块的使用
  8. 个人网站接入第三方支付(非个体商户和企业)
  9. 职业梦想是计算机的英语作文,高中英语作文我的梦想职业
  10. 一通百通,带你一次性全理解Spring 中的Template