1 条题解
-
0
题解:Good Bitstrings 计数
问题转化
函数
gen_string(a,b)生成一个长度为 的二进制串,其中有 个0和 个1。
生成规则:维护 分别表示已生成的0和1的个数,每次比较 和 ,选择比值较小的一侧添加对应字符(相等时加0)。好串:存在 使得 s = \texttt{gen_string}(x,y)。
给定 ,求 \texttt{gen_string}(A,B) 的所有前缀中好串的个数。
关键性质
生成过程可看作在平面 上从 到 的路径,每次向右(
0)或向上(1),选择规则是比较 和 ,即比较斜率 与 (但 时特判)。好前缀对应于路径上某个点 恰好是某个生成过程 的终点,且从 到 的路径与用 生成的路径一致。
生成路径的几何解释
设当前点 ,若 则向右走,否则向上走。
这等价于在直线 下方(或线上)时向右走,上方时向上走。
因此路径是沿着斜率 的直线“交替”前进的格点路径。
好前缀的特征
对于前缀 ,若它是好的,则存在 使得 \texttt{gen_string}(x,y) 的长度为 ,且生成的串与 的前缀相同。
这要求 满足:从 到 的路径与用 生成的路径一致,且该路径也是从 到 的唯一生成路径(根据规则)。
已知结论
好前缀 对应 需满足:
- 在直线 的路径上
- 是某个 Farey 序对(即 )
- 且 是 的生成路径上的某个点
实际上,好前缀 必须满足存在 使得 是 的生成路径上的一点,且从 到 的子路径与用 生成时一致。
Stern–Brocot 树
生成规则本质是 Stern–Brocot 树上的行走:
每个分数 对应一个生成串,路径是沿 SB 树从 到 的路径。好前缀对应 SB 树上某个节点 的路径前缀,且该前缀也是从 到 的路径的一部分。
因此问题转化为:在 SB 树上从 到 的路径上,有多少个节点 使得从根到该节点的路径是从 到 的路径的前缀。
算法步骤
- 将 化为最简分数(除以 )。
- 在 Stern–Brocot 树上模拟从 到 的路径:
- 左子节点 ,右子节点
- 比较 与当前节点的分数,决定向左/右走
- 统计路径上所有节点(包括端点)的个数,即为答案。
复杂度
SB 树深度为 ,每步比较用分数避免浮点误差(交叉相乘)。
由于 ,使用
__int128比较。总复杂度 。
实现细节
- 初始左分数 ,右分数 。
- 当前节点 。
- 比较 与 : 若 则向左走() 否则向右走()
- 每走一步计数 ,直到 的最简形式。
答案 = 路径节点数(包括起点 和终点 )。
最终答案
输出路径长度即可。
- 1
信息
- ID
- 6082
- 时间
- 2000ms
- 内存
- 256MiB
- 难度
- 10
- 标签
- 递交数
- 1
- 已通过
- 1
- 上传者