博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
51Nod-1486 大大走格子
阅读量:6819 次
发布时间:2019-06-26

本文共 1627 字,大约阅读时间需要 5 分钟。

类型为含有多个禁止位置的路线问题

h行w列矩阵,从左上角出发,只能向右或下走,且有n个禁止位置,求到右下角的路线数

\(1 \leq h, w \leq 10^5, 1 \leq n \leq 2000\)

容斥,对禁止位置排序,考虑到达第i个禁止位置的不经过其他禁止位置的路线,它可以通过容斥,用前i-1个更新。

复杂度\(O(n^2)\)

#include 
#include
#include
#define MOD 1000000007using namespace std;typedef long long LL;int h, w, n;const int maxn = 2e3 + 10;const int maxhw = 2e5 + 10;LL ans[maxn];int fact[maxhw], inv[maxhw], INV[maxhw];struct node { int x; int y;} pn[maxn];bool cmp(const node& A, const node& B) { return A.x == B.x ? A.y < B.y : A.x < B.x;}void init() { fact[0] = fact[1] = 1; inv[0] = inv[1] = 1; INV[0] = INV[1] = 1; for (int i = 2; i < maxhw; i++) { fact[i] = (LL)fact[i - 1] * i % MOD; inv[i] = (LL)(MOD - MOD / i) * inv[MOD % i] % MOD; INV[i] = (LL)inv[i] * INV[i - 1] % MOD; }}int main() { init(); scanf("%d%d%d", &h, &w, &n); for (int i = 0; i < n; i++) { scanf("%d%d", &pn[i].x, &pn[i].y); } sort(pn, pn + n, cmp); pn[n].x = h; pn[n].y = w; for (int i = 0; i <= n; i++) { int x = pn[i].x; int y = pn[i].y; ans[i] = (LL)fact[x + y - 2] * INV[x - 1] % MOD * INV[y - 1] % MOD; for (int j = 0; j < i; j++) { int nx = pn[j].x, ny = pn[j].y; if (nx > x || ny > y) continue; ans[i] = (ans[i] - ans[j] * fact[x - nx + y - ny] % MOD * INV[x - nx] % MOD * INV[y - ny] % MOD ) % MOD; } } printf("%lld\n", (ans[n] + MOD) % MOD); return 0;}

转载于:https://www.cnblogs.com/xFANx/p/9532565.html

你可能感兴趣的文章
删除Jenkins的构建次数(基于Jmeter的Maven项目)
查看>>
springboot中配置文件配置各种随机数
查看>>
scala----函数和构造函数区别
查看>>
Linux平台的boost安装方法
查看>>
重温关于进程间通信的方式
查看>>
Spring
查看>>
HBase安装配置
查看>>
ssh 连接非22端口服务器的方法:
查看>>
Linux基础入门
查看>>
org.hibernate.hql.internal.ast.QuerySyntaxException: user is not mapped
查看>>
图解排序算法之快速排序-双端探测法
查看>>
mysql
查看>>
程序中的bug程度分析
查看>>
[算法][LeetCode] Dynamic Programming(DP)动态规划
查看>>
12.8 Nginx用户认证
查看>>
11月15日云栖精选夜读:分布式服务框架Dubbo疯狂更新!阿里开源要搞大事情?...
查看>>
跨链技术的分析和思考
查看>>
大数据(hadoop-HDFS原理分析)
查看>>
usermod命令 、用户密码管理、 mkpasswd命令
查看>>
一周第三次课
查看>>