反射容斥
反射容斥
一类关于格路计数的容斥手法。
考虑一种卡特兰数通项公式的组合证明。
一种卡特兰数的等价描述是从 走到 的路径数,每次只能走简单格路(每一维的变化量的绝对值的和为 ),不能经过 这条直线的路径方案数。
首先如果没有不经过直线的限制的方案数为 ,现在考虑如果不满足限制会发生什么。
对于一个经过 的路径,找到路径与直线的第一个交点 ,将之前的路径沿着 翻折,那么起点翻折后为 。
那每一条从 走到 的路径都恰好对应一条从 走到 经过 的路径。
所以有公式:
运用这个方法可以很好的运用到计数到达 (保证 ) 且不经过 的直线的方案数。
方案数为:,证明与上面类似。
再推广一波,从 到 不经过直线 的方案数为:。
继续思考:求从 到 不经过直线 且 的方案数
先想:反射容斥能解决的是:可以找到路径第一次和某条直线的交点,然后翻折过去。
定义由 构成的字符串例如 表示依次先与 相交再和 相交再和 相交。(如果连续多次与一条直线相交只记录一次)
顺次处理字符串中的字符,然后前面的部分关于字符对应的直线翻折,假设最后起点为 ,答案为 。
使用反射容斥可以计算的是所有包含当前串为子序列的字符串所代表的路径总数。(画图方便理解)
要求的答案为字符串为空集。
设 表示处理 串得到的答案(即计算。使用容斥可得到。
证明:一个串 ( 开头同理),空集有 的贡献。能成为子序列的有 的前缀以及 去掉第一位的所有前缀,那么刚好会做 的贡献,第一个串的贡献是 (第一位开始),第二个串的贡献是 (第二位开始),两柿相加和恰好为 ,再加上空集的贡献恰好为 。所以只有当 为空集才会贡献。
化简可得:
注意: 可以取到所有整数,但是有值的位置只有 个。
【集训队作业2018】count
题目要求统计长度为 ,值域在 且每种值至少出现一次的不同构的笛卡尔树个数。(如果有多个最大值取编号最小的)
首先 必然无解。
那么对于每个点,左儿子的取值要严格小于它,右儿子的取值小于等于它。
设 为括号序列,
定义向左链长即为 的最大嵌套层数。
观察到向左链长只要小于等于 为笛卡尔树合法的充要条件。
必要性:如果向左链长大于了 ,那么至少有 个不同的数,不合法。
充分性:考虑对每个节点分配合法的值域范围 ,当前节点直接取 ,左儿子分配 ,右儿子分配 即可。
注意到一个括号序列恰好对应一棵二叉树,转为对括号序列的计数。
将左括号看成 ,右括号看成 ,转化为计数从 走到 ,每次只能向右上/右下走,且不能经过 和 的路径方案数。
发现这与我们介绍的双边界反射容斥不大相同。
考虑一种常见的手法,通过对坐标轴的旋转/对称/平移将已知推未知。
将坐标轴旋转 45 度,变为计数从 走到 ,每次只能向左或者向上走,且不经过 和 的方案数。
套用公式可得:
P3266 [JLOI2015] 骗我呢
首先注意到每行 个数且互不相同,一共有 个数,那么中间只会有一个数没被用。
设 表示第 行不用值 的方案数。又因为 。
每个点是由它右下角的点以及左侧的点转移而来,这并不符合我们的需求。
考虑将底 行的所有点集体向右平移 个为位置。那么有:
这是我们所会的,即从 走到 不经过 和 的方案数,带入柿子即可。(我知道你想要最终的柿子)
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具