#创作计划# 反射容斥
2026-03-29 14:22:51
发布于:河南
Part 0
有一张 的网格图,每次只能向右或向上走,问从 出发走到 的方案数。
总共会走 步,选出 步向右走,方 案数即为 。
Part 1
有一张 的网格图,每次只能向右或向上走,问从 出发走到 且不接触到 直线的方案数。
考虑用总方案数减去接触到该直线的方案数,总方案数显然为 ,只需求出接触到该直线的方案数即可。
考虑第一次接触到该直线的时候就将之后的路径与该直线对称,则最后到达的点即 ,方案数即为 。
故方案数即为 。
Part 2
将一条直线扩展为两条斜率为 的直线,仍然是从 出发走到 。
若两条直线在 同侧,则可视为一条限制,所以在此只考虑不在同一侧的情况。
不妨设上方的直线为 ,下方的直线为 ,终点为 。
借用 Part 1 的思想考虑容斥,总方案依然为 。考虑将不合法的路径接触直线 的顺序写下来,大概为 ,不妨将连续接触同一条直线缩成一次,则顺序为 。
有一个简单直观的容斥为:合法方案数=总方案数-序列开头为 的方案数-序列开头为 的方案数。
而开头为 的方案数似乎可以看成从 走到 关于 的对称点的方案数?
发现不能这样简单的计算,因为这些方案还包括开头为 的方案;同理,从 走到 关于 的对称点的方案数也包括开头为 的方案。同时减去这两项就会多减去开头为 和 的方案数,考虑如何求出这两项。
类比只接触一次的对称,以开头为 举例,将路径接触 之后的一段沿 对称,然后将路径接触 之后的一段沿 对称(若先沿 对称会导致对称之后可能不接触 了)。
此时终点为 先沿 对称后沿 对称。发现此时仍然可能多记上开头为 的方案数,所以一直容斥下去直到终点不在第一象限即可。
发现我们每次向后加数,却是从后向前对称,不妨从结尾考虑,即:合法方案数=总方案数-结尾为 的方案数-结尾为 的方案数+,此时就可以维护两个终点坐标,每次分别沿 对称,乘上容斥系数即可。
时间复杂度分析:发现每两次对称都会在经过终点的斜率为 的直线上移动 的距离,所以时间复杂度为 。
[SCOI2010] 生成字符串
模板题,设 为左括号选了 个,右括号选了 个的方案数,则要求 ,求 。
转到网格图上, 变为不接触 ,变为 Part 1 内容。
Math Exam
解个方程,发现 ,当 时, 或 ,形式很不好看,经过神秘推导或神秘注意,设 ,则有 。
此时发现是一维的,将 转化为向右走, 转化为向上走,则根据绝对值与原题意的要求,有不接触直线 与 的要求,由于从 出发,第一步只能向右走,所以 不必特殊处理。至此,此题转化为了 Part 2。
【集训队作业2018】count
此处有两个转化。
第一处转化参考 CF1748E,第二处转化考虑将笛卡尔树和括号序列结合。
首先有 无解。
其中 为 序列的笛卡尔树上 的 ,则同构的条件即为两个序列的笛卡尔树形态相同。第一步转化为笛卡尔树形态计数。
设 为 子树内转化的括号序列,有 ,设 为 中括号最大嵌套深度,则 的所有整数都在树中出现过的条件转化为 。
必要性:若 ,则必须需要多于 个数才能填满整棵树。
充分性:由于有 ,则令 ,最后选取若干条链将其权值增大微调即可。
则问题转化为对于整棵树形成的括号序列计数。
设 为目前已经填了 个左括号与 个右括号的方案数,考虑约束有哪些。
首先由括号序列自身的 约束,而当前括号序列的深度可以转化为 ,则还要求了 ,将 当作横坐标, 当作纵坐标,转化到网格图上即为从 出发,到达 ,不接触直线 与 的方案数。使用 Part 2 解决。
[JLOI2015] 骗我呢
发现值域为 ,则一行只有一个位置会 ,可以做出来简单 dp,优化过后变为 。
代数推导一点不会,组合意义天崩地裂。
考虑组合意义,将其放在网格图上,考虑将 dp 值变为到达 的路径条数,dp 转移看为一条边。发现转移中有斜着的边,不好处理,所以将其平移。发现行末仍然有一条斜边,将其扩展为先向右再向下,于是得到一张网格图。由于将每一行行末扩展了,所以每一行长度为 ,则问题变为在网格图上,从原点出发,到达 的方案数。
如图:

至此,将问题转化为了 Part 2,使用反射容斥即可线性求出答案。
[AGC070C] No Streak
先找直线的限制,发现只有一个即 A 胜场数始终大于等于 B 胜场数,则不妨设 表示 A 胜了 场,B 胜了 场,平局了 场的方案数,将 当作坐标,则现在需要考虑的问题即为如何消去不接触 这条直线的限制。
发现如果直接按照 Part 1 中 的式子(下文若无特殊说明,路径均指未对称的路径),不仅会多记录上第一次接触直线后仍然向上的路径(因为对称之后变成向上向右,从不合法变为合法了);还会少记录上第一次接触直线后向右的路径(因为对称之后变成连续两次向上,从合法变为不合法)。
发现合不合法都和第一次和直线接触后的移动强相关,所以分类讨论一下:
-
第一次接触直线后直接向右,对称后变成连续两次向上,所以不妨扣掉一次向上,即 ,最后在当前位置加上一次向上,形成双射。
-
第一次接触直线后停歇,此时可以任意走,仿照上述方法,扣掉一次停歇,即 ,但是会少计算上停上的情况,所以再减去扣掉一次停歇和向上的方案,即 ,与原路径形成双射。
最后的答案即为:。
问题来到如何求出 ,由于每相邻的两个 a 之间都需要一个别的东西来隔开,所以枚举有 对 a 之间需要用 b 隔开,然后忽略 b,先只考虑只有 a 和 x 的情况,则 对 a 相邻的情况即为 。
剩下的 个空都至少需要一个 x 隔开,而后剩下的 x 可以任意填在 个空中,使用插板法计算。
最后考虑 b, 对相邻的 a 之间需要插入一个 b,剩下的 b 可以任意填在 个空中,但每个空至多填一个 b,依旧使用插板法计算即可。
最后得到:
本题需要对反射容斥的形态有深刻的理解。
全部评论 2
注意到应该是“创作计划”
2026-03-27 来自 浙江
0qpzc
2026-03-27 来自 广东
0
















有帮助,赞一个