祝 jiazhichen844 和 Olddrivertree 两位大神百年好合!
违规用户名1425622 · · 题解
不是这么良心的题咋没有题解啊?那我就先写一篇抢个一血吧。
一、什么是 Stern–Brocot tree?
Stern–Brocot tree(也可以叫 SBtree)是一种可以维护所有既约分数(分子分母互质)的树形结构,长成这样:
(图源来自 oi-wiki,侵删)
那么这颗树是怎么建成的呢?
事实上,我们可以按照如下方式构建一棵 Stern–Brocot tree。
- 我们设一对分数
(\frac{a}{b},\frac{c}{d}) 表示一棵下界为\frac{a}{b} ,上界为\frac{c}{d} 的 Stern–Brocot tree,那么其根的左儿子为(\frac{a}{b},\frac{a+c}{b+d}) ,右儿子为(\frac{a+c}{b+d},\frac{c}{d}) ,根代表的分数即为\frac{a+c}{b+d} 。
那么原图的含义就很明显了,就是一棵以
那么这么奇怪的定义方法得到的树有什么性质吗?
二、这种东西有什么性质呢?
实际上,Stern–Brocot tree 有着很多非常良好的性质,这也使得它成为了维护既约分数的最常用方法,我们依次来看。
- 最简性:Stern–Brocot tree 上的所有分数都为既约分数。
- 单调性:Stern–Brocot tree 的中序遍历单调递增。
- 完整性:Stern–Brocot tree 不重不漏的包含了所有既约分数。
- 有限性:Stern–Brocot tree 上的所有分子和分母有限的既约分数的深度也有限,具体的,设
\operatorname{dep}(\frac{a}{b}) 表示分数\frac{a}{b} 的深度,则有\operatorname{dep}(\frac{a}{b}) \le a+b 。
如果不想看详细的数学证明可以跳过,因为只要知道结论即使不知道证明也可以看懂下面的内容,但是看了证明会加深你对 Stern–Brocot tree 的理解,下面将逐个证明这些结论。
part.1 最简性
问题相当于保证
由于裴蜀定理,则我们只需要找到一组整数
我们令
引理 1.1:对于在 Stern–Brocot tree 种属于同一层的相邻既约分数
\frac{a}{b} 和\frac{c}{d} ,有bc-ad=1 。
考虑数学归纳,如果上一层的两个分数为
由引理 1.1 易得最简性成立。
part.2 单调性
由 Stern–Brocot tree 的生成方式易得命题等价于
part.3 完整性
这里我认为 oi-wiki 上利用有限性给的证明是不严谨的,因为有限性的成立建立在所有分数均可表示的基础上,因此我会给出一个不需要有限性的证法。
考虑将 Stern–Brocot tree 上的所有分数看作向量。
那么对于一个向量
part.4 有限性
考虑 Stern–Brocot tree 的生成方式,不妨设当前的子树为
那么我们显然有
将两式分别乘以
三、这个东西有什么用呢?
好吧其实这个东西没什么用。
当我们要求与有理数相关的问题时,Stern–Brocot tree 就是一个很好用的工具,比如其最常见的应用:最佳有理逼近。
最佳有理逼近
问题形如:给定一个数
关于这个问题 oi-wiki 上已经做了详细的说明,具体思路就是我们维护每次要是要走向左儿子还是右儿子,并且求出走向左儿子的次数和右儿子的次数,当我们知道
但是我们不知道
- 对于每次向左或右跳的过程,先倍增求出跳
2^c 步还能使条件成立的最大的c ,之后从2^c 开始倍增求出精确的步数。
你可能会说,这个东西还要倍增两遍,难道不是比我
四、一些需要用到的题
P1797【模板】Stern-Brocot 树
第一、二、五个操作易做,考虑第三和四个,发现第三个操作只需要求出来两个分数的操作路径的最长相等前缀即可,第四个操作类似。
P8058 [BalkanOI 2003] Farey 序列
很经典的最佳有理逼近问题,check 可以使用类欧和狄利克雷求和搞定。
AT_abc333_g [ABC333G] Nearest Fraction
盐都不盐了,最佳有理逼近板子。