一本通OJ 1810 登山 题解

news2024/10/7 8:25:49

题目链接

题目大意

( 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)
在这里插入图片描述
接下来以这个例子来解释做法,再次考虑容斥原理

如果不考虑不超过 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)
在这里插入图片描述
( 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)
在这里插入图片描述
( 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

#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;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/782718.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

解决阿里云服务器不能访问端口

服务器已经下载了redis&#xff0c;kafka&#xff0c;但就是访问不了端口号&#xff0c; 开通云服务器以后&#xff0c;请一定在安全组设置规则&#xff0c;放行端口 防火墙要关闭

服务器内存满了解决之路

背景&#xff1a;大清早&#xff0c;突然一通电话吵醒&#xff0c;说项目跑不了&#xff0c;还没洗漱赶紧跑过来&#xff0c;毕竟属于实时在用的系统。排查发现系统盘满了&#xff0c;数据写不进去了&#xff0c;导致报错。接手的项目&#xff0c;从来没考虑服务器问题&#xf…

SR501人体红外模块

文章目录 前言一、SR501模块介绍二、设备树添加节点三、驱动程序四、测试程序五、上机测试及效果总结 前言 人体红外模块 是一种能够检测人或动物发射的红外线而输出电信号的传感器。广泛应用于各种自动化控制装置中。比如常见的楼道自动开关、防盗报警等。 一、SR501模块介绍…

深度学习-第R1周心脏病预测

&#x1f368; 本文为&#x1f517;365天深度学习训练营 中的学习记录博客&#x1f356; 原作者&#xff1a;K同学啊 我的环境&#xff1a; 语言环境&#xff1a;Python3.10.7编译器&#xff1a;VScode深度学习环境&#xff1a;TensorFlow 2.13.0 一、前期工作&#xff1a; …

语义通信中基于深度双Q网络的多维资源联合分配算法

目录 论文简介系统模型多维资源联合分配模型多维资源联合分配算法 论文简介 作者 林润韬 郭彩丽 陈九九 王彦君发表期刊or会议 《移动通信》发表时间 2023.4 系统模型 场景中的边缘服务器部署在路边单元上&#xff0c;每个路边单元具有一定的无线覆盖区域&#xff0c;服务器将…

安装mmocr

安装mmocr 一、安装mmdetection 在安装前&#xff0c;如果已经安装过mmcv&#xff0c;先卸载掉&#xff0c;否则不同版本会导致ModuleNotFoundError报错&#xff01; 1、先安装对应版本的pytorch&#xff08;本次cuda10.2&#xff0c;pytorch1.7&#xff09; 2、安装对应版本的…

TableGPT: Towards Unifying Tables, Nature Language and Commands into One GPT

论文标题&#xff1a;TableGPT: Towards Unifying Tables, Nature Language and Commands into One GPT 论文地址&#xff1a;https://github.com/ZJU-M3/TableGPT-techreport/blob/main/TableGPT_tech_report.pdf 发表机构&#xff1a;浙江大学 发表时间&#xff1a;2023 本文…

搭建基于Nginx+Keepalived的高可用web集群并实现监控告警

目录 搭建相关服务器DNS服务器配置WEB服务器配置配置静态IP编译安装nginx 负载均衡器配置lb1lb2高可用配置 NFS服务器配置配置静态IP安装软件包新建共享目录web服务器挂载 监控服务器配置安装node-exporter编写prometheus.yml安装alertmanager和钉钉插件获取机器人webhook编写a…

ubuntu22.04上如何创建有privilege权限,有固定自定义IP的空容器

需求背景&#xff1a; 我想用docker来隔离自己的主机环境&#xff0c;来创建一个隔离的空白全新的开发环境&#xff0c;并且使之有固定的IP&#xff0c;在里面可以自由更新下载各种编译依赖&#xff0c;具有privileged权限的容器&#xff0c;以下是操作实现的具体步骤 查看do…

系统架构设计师-软件架构设计(2)

目录 一、基于架构的软件开发方法&#xff08;ABSD&#xff09; 1、架构需求 1.1 需求获取 1.2 标识构件 1.3 架构需求评审 2、架构设计 2.1 提出架构模型 2.2 映射构件 2.3 分析构件的相互作用 2.4 产生架构 2.5 设计评审 3、架构文档化 4、架构复审 5、架构实现 5.1 分析与…

JVM运行时区域——对象创建内存分配过程

新创建的对象&#xff0c;都存放在伊甸园区域&#xff0c;当垃圾回收时&#xff0c;将伊甸园区域的垃圾数据销毁&#xff0c;然后将存活的对象转移到幸存者0区域&#xff0c;之后创建的新的对象还是存放在伊甸园区域&#xff0c;等到再次垃圾回收后&#xff0c;将伊甸园区域和幸…

《Docker资源限制和调度策略:性能优化与资源管理,打造高效稳定的容器环境》

&#x1f337;&#x1f341; 博主 libin9iOak带您 Go to New World.✨&#x1f341; &#x1f984; 个人主页——libin9iOak的博客&#x1f390; &#x1f433; 《面试题大全》 文章图文并茂&#x1f995;生动形象&#x1f996;简单易学&#xff01;欢迎大家来踩踩~&#x1f33…

Python 集合 pop()函数使用详解,pop随机删除原理

「作者主页」&#xff1a;士别三日wyx 「作者简介」&#xff1a;CSDN top100、阿里云博客专家、华为云享专家、网络安全领域优质创作者 「推荐专栏」&#xff1a;小白零基础《Python入门到精通》 pop函数使用详解 1、随机删除并不完全随机1.1、纯数字1.2、纯字符1.3、混合情况 …

【软件测试】Git 详细实战-远程分支(超细总结)

目录&#xff1a;导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09; 前言 远程分支 远程引…

2023云曦期中复现

目录 SIGNIN 新猫和老鼠 baby_sql SIGNIN 签到抓包 新猫和老鼠 看到反序列化 来分析一下 <?php //flag is in flag.php highlight_file(__FILE__); error_reporting(0);class mouse { public $v;public function __toString(){echo "Good. You caught the mouse:&…

使用Selenium与Chrome DevTools交互

目录 为什么我们应该自动化Chrome开发工具&#xff1f; 如何打开Chrome DevTools 元素 控制台 源代码 网络 应用 安全 性能 如何使用Selenium使用chrome Devtools实现自动化&#xff1f; 收集性能指标 使用Selenium DevTols捕获控制台日志 模拟位置 网络节流 捕…

论文精读之Transformer论文

目录 Abstract Conclusion Introduction Background Training Abstract 在一个序列转录模型中&#xff0c;在编码器与译码器之间使用一个“注意力机制”的东西&#xff0c;做了两个机器翻译的实验&#xff0c;效果较其他模型效果更好。 Conclusion Transformer是第一个用于…

全志F1C200S嵌入式驱动开发(调整cpu频率和dram频率)

【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing @163.com】 f1c200s默认的cpu频率是408M,默认的dram频率是156M。这两个数值,坦白说,都算不上特别高的频率。因为我们的晶振是24M输入,所以408/24=17,相当于整个cpu的频率只是晶振倍频了17…

vue引入自定义字体并使用

结构 font.scss引入字体 charset "UTF-8";font-face{font-family: "caoshu";src: url("caoshu.ttf");font-weight: normal;font-style: normal; }font-face{font-family: "Xingkai";src: url("XingKai.ttf");font-weight: …

leetcode 144.二叉树的前序遍历 145.二叉树的后序遍历 94.二叉树的中序遍历

⭐️ 题目描述 &#x1f31f; 链接1&#xff1a;leetcode 144.二叉树的前序遍历 &#x1f31f; 链接2&#xff1a;leetcode 145.二叉树的后序遍历 &#x1f31f; 链接3&#xff1a;leetcode 94.二叉树的中序遍历 思路&#xff1a; leetcode的遍历和普通的遍历还略有一些不同&a…