专栏文章
AGC065D Not Intersect 题解
AT_agc065_d题解参与者 2已保存评论 1
文章操作
快速查看文章及其快照的属性,并进行相关操作。
- 当前评论
- 1 条
- 当前快照
- 1 份
- 快照标识符
- @mipv1t91
- 此快照首次捕获于
- 2025/12/03 18:24 3 个月前
- 此快照最后确认于
- 2025/12/03 18:24 3 个月前
@RedreamMer 题解重制版。再次拜谢 ZAK 的做法。
Raney 引理
对于整数序列 ,如果 ,那么 的 个循环移位的序列中恰好有一个满足:该序列的所有前缀和均为正整数。
证明:构造周期为 ,定义域为 的函数 ,满足 。

偷了张图,这是序列 构造出的函数。
用直线 从 处往上平移去切函数图像。图中切线为 。
此切线与 在一个周期中恰好切于一个整点。
这里认为周期是 。容易说明切点是整点。设切点为 。因为直线的斜率为 ,所以直线 除了在 处,在该周期内的其它函数值均不为整数,不可能与 相切。
从 开始的循环移位就是我们要求的:序列的所有前缀和均为正整数的那个循环移位。
还要说明其它循环移位的序列均存在某个前缀和不是正整数。容易说明其它循环移位的序列在 之前的前缀和 。
引理证毕。
我们还需要用到另一个引理:
对于整数序列 ,如果 ,那么 的 个循环移位的序列均不相同。
对于 显然成立。对于 ,考虑反证法。如果有两个循环移位的序列相同,那么存在周期 ,使得 。
从 开始在模 意义下不停以步长为 的步跳,跳到的点均和 相等。容易说明等价类大小为 ,可以进一步得到 。
在 时, 也大于 。 需要是某个大于 的数的倍数,假设不成立。
引理证毕。
构造双射
以下的讨论均对于 。
把圆看成一个正 边形。加的 条边相当于在对正 边形进行划分。
正 边形上相邻的两点之间的边是否连接不会对划分的形态产生影响,不妨枚举有多少条这样的边。设有 条,方案数为 。现在问题变成了要连接 条边,连接的边不能与原来正 边形上的边重合,问可以得到多少本质不同的正 边形划分。
破环为链。容易发现限制不会产生变化。
构造双射。假设有个栈,初始为空。我们要把 依次加入栈中。在任意时刻可以选择:
- 把 加入栈中
- 此时栈顶为 ,选择一个正整数 ,弹出栈顶的 个数。视为 与当前栈顶连一条边。如果栈里没有点,那么就是 和 连边。连完边后再把 放回去。

如图,这样的图形可以用以下的流程描述。
| 操作 | 栈 |
|---|---|
| 加入 | |
| 加入 | |
| 加入 | |
| 取 ,连边 | |
| 取 ,连边 | |
| 加入 | |
| 加入 | |
| 加入 | |
| 加入 | |
| 取 ,连边 |
主播主播,有没有更加深刻的理解?有的,当然有的。
栈中的数和 就是当前所有可以连边的点。每次连边的时候可供连边的点都会减少。这同时保证了不会连出相邻的边。
这个过程其实就是扫描边的右端点 。把所有右端点为 的边按左端点从右往左的顺序加入。
其实这样会存在一个问题。就是边 。这条边属于相邻的边,其实是不应该存在的。但是在上面的过程中,只要把最后一步改成 ,就会连出这样的边。
解决的方式是我们钦定必须有边 (但这条边实际上不存在)。这样做的好处在于:
- 任意合法的图按照上述方式构造操作序列后,栈中剩余的数数量 ,取 栈中剩余的数数量 就能把边 这条边加上。双射的性质没有变,同时解决了会连出 的情况。
- 设加入点为 ,连边为 ,得到的操作序列和为 (栈中最后只剩 这一个数)。
计算答案
特判掉 。对于 ,套用 Raney 引理计算答案。
假设我们有一个操作序列:序列中有 个 , 个负数,这些数的和为 。但是这个序列可能是不合法的。序列合法的条件是:栈中任意时刻都要有至少一个数,即序列的所有前缀和均为正整数。
根据 Raney 引理,这个序列的循环同构中恰好有一个是合法的。又通过前面的引理可以得到,这个序列所有的循环同构都不相同。这样就不会计重了!
容易发现根据当前的计算方式,可以得到 。因为 ,所以只有 时答案才不为 。
令 。只要统计合法操作序列数量即可,每个合法操作序列对答案的贡献是 。有 个负数,这些数的和为 。先给每个数分配 ,还剩 个负单位可以分配。插个板得到 。然后要把 个 和 个负数归并在一起。方案数为 。
总答案:
时间复杂度 。代码。
相关推荐
评论
共 1 条评论,欢迎与作者交流。
正在加载评论...