一本通OJ 1810 登山 题解

这篇具有很好参考价值的文章主要介绍了一本通OJ 1810 登山 题解。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

题目链接

题目大意

( 0 , 0 ) (0,0) (0,0) 走到 ( n , n ) (n,n) (n,n) ,不能超过直线 y = x y=x y=x,并且图上有 m m m 个点不能走,问你有几种方案

解题思路

很明显这题与卡特兰数有关,但是不同点在于这题中存在点不能走

考虑容斥,我们要求出总方案数和不合法方案数相减

总方案数即是卡特兰数

假设 f i f_i fi 是从 ( 0 , 0 ) (0,0) (0,0) 走到第 i i i 个不能走的点 ( x i , y i ) (x_i,y_i) (xi,yi) 且不经过之前任何一个不能走的点的方案数

这样就能保证不会重复统计

考虑 f i f_i fi 如何递推:

再次考虑容斥, f i f_i fi 等于从 ( 0 , 0 ) (0,0) (0,0) 走到 ( x i , y i ) (x_i,y_i) (xi,yi) 的方案数减从 ( x i − 1 , y i − 1 ) (x_{i-1},y_{i-1}) (xi1,yi1) 走到 ( x i , y i ) (x_i,y_i) (xi,yi) 的方案数乘 f i − 1 f_{i-1} fi1

那么现在需要解决的是,如何求从 ( x a , y a ) (x_a,y_a) (xa,ya) 走到 ( x b , y b ) (x_b,y_b) (xb,yb) 的方案数

具体的,我们假定从 ( 3 , 0 ) (3,0) (3,0) 走到 ( 6 , 5 ) (6,5) (6,5)
一本通OJ 1810 登山 题解,题解,组合数学
接下来以这个例子来解释做法,再次考虑容斥原理

如果不考虑不超过 y = x y=x y=x,那么从 ( 3 , 0 ) (3,0) (3,0) 走到 ( 6 , 5 ) (6,5) (6,5) 总共有 C 6 − 3 + 5 − 0 6 − 3 C_{6-3+5-0}^{6-3} C63+5063

不超过 y = x y=x y=x 等价于不经过 y = x + 1 y=x+1 y=x+1,我们将点 ( 6 , 5 ) (6,5) (6,5) 对称过去得到点 ( 4 , 7 ) (4,7) (4,7)
一本通OJ 1810 登山 题解,题解,组合数学
( 3 , 0 ) (3,0) (3,0) 走到 ( 4 , 7 ) (4,7) (4,7) 的方案数与从 ( 3 , 0 ) (3,0) (3,0) 走到 ( 6 , 5 ) (6,5) (6,5) 的不合法的方案是相等

解释如图,从 ( 3 , 0 ) (3,0) (3,0) 走到 ( 4 , 7 ) (4,7) (4,7) 的路线超出 y = x + 1 y=x+1 y=x+1 的部分对称回去即可走到 ( 6 , 5 ) (6,5) (6,5)
一本通OJ 1810 登山 题解,题解,组合数学
( 3 , 0 ) (3,0) (3,0) 走到 ( 4 , 7 ) (4,7) (4,7) 总共有 C 4 − 3 + 7 − 0 4 − 3 C_{4-3+7-0}^{4-3} C43+7043

因此从 ( 3 , 0 ) (3,0) (3,0) 走到 ( 6 , 5 ) (6,5) (6,5) 的合法的方案即为 C 6 − 3 + 5 − 0 6 − 3 − C 4 − 3 + 7 − 0 4 − 3 C_{6-3+5-0}^{6-3}-C_{4-3+7-0}^{4-3} C63+5063C43+7043

( x b , y b ) (x_b,y_b) (xb,yb) 关于 y = x + 1 y=x+1 y=x+1 对称即为 ( y b − 1 , x b + 1 ) (y_b-1,x_b+1) (yb1,xb+1),不合法方案数 C y b − 1 − x a + x b + 1 − y a y b − 1 − x a = C x b − x a + y b − y a y b − x a − 1 C_{y_b-1-x_a+x_b+1-y_a}^{y_b-1-x_a}=C_{x_b-x_a+y_b-y_a}^{y_b-x_a-1} Cyb1xa+xb+1yayb1xa=Cxbxa+ybyaybxa1

由此可以推导得出,从 ( x a , y a ) (x_a,y_a) (xa,ya) 走到 ( x b , y b ) (x_b,y_b) (xb,yb) 的方案数为 C x b − x a + y b − y a x b − x a − C x b − x a + y b − y a y b − x a − 1 C_{x_b-x_a+y_b-y_a}^{x_b-x_a}-C_{x_b-x_a+y_b-y_a}^{y_b-x_a-1} Cxbxa+ybyaxbxaCxbxa+ybyaybxa1

Q:如果出现 y b − 1 < x a y_b-1<x_a yb1<xa 的情况怎么办?(可以证明不存在 x b + 1 < y a x_b+1<y_a xb+1<ya 的情况)

A:可以发现这种情况不存在不合法方案,所以方案数即为 C x b − x a + y b − y a x b − x a C_{x_b-x_a+y_b-y_a}^{x_b-x_a} Cxbxa+ybyaxbxa

最后答案就是从 ( 0 , 0 ) (0,0) (0,0) 走到 ( n , n ) (n,n) (n,n) 的方案数减从 ( x m , y m ) (x_m,y_m) (xm,ym) 走到 ( n , n ) (n,n) (n,n) 的方案数乘 f m f_m fm

因此也可以把 ( n , n ) (n,n) (n,n) 变成第 m + 1 m+1 m+1 个点进行同样操作

code文章来源地址https://www.toymoban.com/news/detail-606657.html

#include <bits/stdc++.h>
using namespace std;
const int N = 1e5 + 9;
const int C = 1009;
const int MOD = 1e9 + 7;
int n, m, a[C], b[C];
long long fac[N * 2], inv[N * 2], f[C], sum;
long long pw(long long a, int b) {
	long long res = 1;
	while (b) {
		if (b & 1) res = res * a % MOD;
		a = a * a % MOD;
		b >>= 1;
	}
	return res;
}
long long c(int n, int m) {return fac[n] * inv[m] % MOD * inv[n - m] % MOD;}
long long sol(int sx, int sy, int tx, int ty) {
	if (ty <= sx) return c(tx - sx + ty - sy, tx - sx);
	else return (c(tx - sx + ty - sy, tx - sx) - c(tx - sx + ty - sy, ty - sx - 1) + MOD) % MOD;
}
int main() {
	scanf("%d%d", &n, &m);
	fac[0] = inv[0] = 1;
	for (int i = 1; i <= n + n; ++ i) fac[i] = fac[i - 1] * i % MOD;
	inv[n + n] = pw(fac[n + n], MOD - 2);
	for (int i = n + n - 1; i >= 1; -- i) inv[i] = inv[i + 1] * (i + 1) % MOD;
	for (int i = 1; i <= m; ++ i) scanf("%d%d", &a[i], &b[i]);
	for (int i = 1; i <= m; ++ i)
		for (int j = i + 1; j <= m; ++ j)
			if (a[i] > a[j] || (a[i] == a[j] && b[i] > b[j]))
				swap(a[i], a[j]), swap(b[i], b[j]);
	for (int i = 1; i <= m; ++ i) {
		f[i] = sol(0, 0, a[i], b[i]);
		for (int j = 1; j < i; ++ j) {
			if (b[i] < b[j]) continue;
			f[i] = (f[i] - f[j] * sol(a[j], b[j], a[i], b[i]) % MOD + MOD) % MOD;
		}
	}
	sum = sol(0, 0, n, n);
	for (int i = 1; i <= m; ++ i)
		sum = (sum - f[i] * sol(a[i], b[i], n, n) % MOD + MOD) % MOD;
	printf("%lld", sum);
	return 0;
}

到了这里,关于一本通OJ 1810 登山 题解的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【ACM组合数学 | 错排公式】写信

    题目链接:https://ac.nowcoder.com/acm/contest/54484/B 题意很简单,但是数据范围偏大。 首先来推导一下错排公式: [D(n) = n!sum_{k=0}^{n}frac{(-1)^k}{k!}] 设一个函数: [S_i表示一个排列中p_i = i的方案数] 那么我们可以知道: [D(n) = n! - |cup_{i=1}^{n}S_i|] 这个表示 所有方案数 减去 至少有

    2023年04月17日
    浏览(37)
  • P3799 妖梦拼木棒(组合数学)

                                                                                                       (学习自用) 提交65.01k 通过15.35k 时间限制1.00s 内存限制125.00MB 上道题中,妖梦斩了一地的木棒,现在她想要将木棒拼起来。 有 n 根木棒,现在从中选 44 根,

    2024年02月01日
    浏览(33)
  • 组合数学——Min-Max容斥

    Min-Max 容斥,即 $$max(S)=sum_{Tin S,Tneqemptyset}(-1)^{|T|-1}min(T)$$ 接下来证明上面那个式子是对的。定义 (S) 中共有 (N) 个元素,由大到小分别为 (s_1,s_2,dots,s_N) , (T_i) 为所有 (S) 大小为 (i) 的子集。 所有元素都大于 (s_i) 且大小为 (j) 的子集有 (tbinom{i-1}{j}) 个;则最

    2024年04月08日
    浏览(39)
  • 【组合数学】【动态规划】【前缀和】1735生成乘积数组的方案数

    【动态规划】【状态压缩】【2次选择】【广度搜索】1494. 并行课程 II 动态规划汇总 C++算法:前缀和、前缀乘积、前缀异或的原理、源码及测试用例 包括课程视频 组合数学 给你一个二维整数数组 queries ,其中 queries[i] = [ni, ki] 。第 i 个查询 queries[i] 要求构造长度为 ni 、每个

    2024年02月19日
    浏览(51)
  • 青蛙跳台阶(C语言数学排列组合公式求解法)

    题目:从前有一只青蛙他想跳台阶,有n级台阶,青蛙一次可以跳1级台阶,也可以跳2级台阶;问:该青蛙跳到第n级台阶一共有多少种跳法。 当只有跳一级台阶的方法跳时,总共跳n步,共有1次跳法                                 当用了一次跳二级台阶的方法跳时,总共

    2024年02月08日
    浏览(40)
  • 【深度优先搜索】【组合数学】【动态规划】1467.两个盒子中球的颜色数相同的概率

    【动态规划】【字符串】【行程码】1531. 压缩字符串 动态规划汇总 深度优先搜索 组合数学 桌面上有 2n 个颜色不完全相同的球,球上的颜色共有 k 种。给你一个大小为 k 的整数数组 balls ,其中 balls[i] 是颜色为 i 的球的数量。 所有的球都已经 随机打乱顺序 ,前 n 个球放入第

    2024年02月21日
    浏览(38)
  • 基于组合优化的3D家居布局生成看千禧七大数学难题之NP问题

    本文探讨了运筹学和组合优化方法在3D家居布局生成中的应用,并调研了AI生成3D场景布局的最新方法。文中结合了家居家装业务的实际应用场景,从算法建模和计算复杂度的角度上阐述了室内设计的布局问题中存在的难点,以及如何用简化和近似的思想来建模3D布局生成问题

    2024年02月07日
    浏览(38)
  • LeetCode 1359. Count All Valid Pickup and Delivery Options【动态规划,组合数学】1722

    本文属于「征服LeetCode」系列文章之一,这一系列正式开始于2021/08/12。由于LeetCode上部分题目有锁,本系列将至少持续到刷完所有无锁题之日为止;由于LeetCode还在不断地创建新题,本系列的终止日期可能是永远。在这一系列刷题文章中,我不仅会讲解多种解题思路及其优化,

    2024年02月09日
    浏览(42)
  • 2018-2019 ACM-ICPC, Asia Nanjing Regional Contest G. Pyramid(组合数学 计数)

    题目 t(t=1e6)组样例,每次给定一个n(n=1e9),统计边长为n的上述三角形的等边三角形个数 其中等边三角形的三个顶点,可以在所有黑色三角形白色三角形的顶点中任取, 答案对1e9+7取模 思路来源 申老师 oeis A000332 Solution to Problem #3 题解 oeis打一下前四项的表,发现是C(n,4),并且

    2024年02月07日
    浏览(35)
  • Educational Codeforces Round 157 (Rated for Div. 2) F. Fancy Arrays(容斥+组合数学)

    题目 称一个长为n的数列a是fancy的,当且仅当: 1. 数组内至少有一个元素在[x,x+k-1]之间 2. 相邻项的差的绝对值不超过k,即 t(t=50)组样例,每次给定n(1=n=1e9),x(1=x=40), 求fancy的数组的数量,答案对1e9+7取模 思路来源 灵茶山艾府群 官方题解 题解 看到 至少 的字眼,首先想到容斥,

    2024年02月05日
    浏览(39)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包