[ARC123F]Insert Addition

Posted Tan_tan_tann

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[ARC123F]Insert Addition相关的知识,希望对你有一定的参考价值。

Insert Addition

题解


前置芝士:Stern-Brocot 树与 Farey 序列

只是简要叙述,没啥用,建议跳过

Stern-Brocot树是一种维护分数的数据结构,树上的节点都是最简形式的分数,且像二叉查找树一样是有序的,在这棵树上我们可以 O ( l o g   n ) O\\left(log\\,n\\right) O(logn)的查找到一个最简形式的分数。
与其说其是一颗树,它更像一个序列,最开始只有 { 0 1 , 1 0 } \\{\\frac{0}{1},\\frac{1}{0}\\} {10,01},再不断通过序列中相邻两项 a / b a/b a/b c / d c/d c/d像糖水混合一样得到新的点 a + b c + d \\frac{a+b}{c+d} c+da+b,通过糖水混合的原理,显然是有序的。
很明显,如果一直这样进行下去,这个序列将会变得无限大,而 F a r e y Farey Farey序列则是选取其中分母不超过某个值得点构成得序列。
很明显,这两者都是可以像线段树一样通过 O ( n l o g   n ) O\\left(nlog\\,n\\right) O(nlogn)的时间复杂度生成,而对上面的节点,我们可以采用生成它的两个点 ( a b , c d ) (\\frac{a}{b},\\frac{c}{d}) (ba,dc)的形式来表示,这种表示方法是唯一的,而且更方便它的遗传与变异。

如果你想了解更多与它相关的东西,可以参考上面的链接。
下面我们的做法讲涉及到它的几条性质。


进入正题

应该还不晚

由于本题要求的序列构建方式与Stern-Brocot树十分相似,我们很容易想到这上面去。
我们可以讲原题中的 a a a b b b转化成一个系数对 ( 1 , 0 ) (1,0) (1,0) ( 0 , 1 ) (0,1) (0,1),序列的生成也就像Stern-Brocot,变成了参数对的左右相加。

性质1
  • 对于可以某种方式相邻的两点,它们的系数对 ( x 1 , y 1 ) (x_1,y_1) (x1,y1) ( x 2 , y 2 ) (x_2,y_2) (x2,y2)一定满足条件 x 1 y 2 − x 2 y 1 = 1 x_1y_2-x_2y_1=1 x1y2x2y1=1
    显然,这两者之间有一个是由另一个与其它的系数对一起构成的。
    我们不妨设 ( x 2 , y 2 ) (x_2,y_2) (x2,y2)是由 ( x 1 , y 1 ) (x_1,y_1) (x1,y1) ( x 3 , y 3 ) (x_3,y_3) (x3,y3)一起构成的,显然有
    x 1 y 2 − x 2 y 1 = x 1 ( y 1 + y 3 ) − ( x 1 + x 3 ) y 1 = x 1 y 3 − x 3 y 1 x_1y_2-x_2y_1=x_1(y_1+y_3)-(x_1+x_3)y_1=x_1y_3-x_3y_1 x1y2x2y1=x1(y1+y3)(x1+x3)y1=x1y3x3y1
    显然,当系数对 ( x 1 , y 1 ) (x_1,y_1) (x1,y1) ( x 3 , y 1 ) (x_3,y_1) (x3,y1)满足条件是,它满足条件。
    一直这样追溯下去,最开始的系数对 ( 0 , 1 ) (0,1) (0,1) ( 1 , 0 ) (1,0) (1,0)显然是满足条件的,所以对于任意两个相邻的系数对,它们都满足这样的条件。
性质2
  • 对于任意两个系数对 ( x 1 , y 1 ) (x_1,y_1) (x1,y1) ( x 2 , y 2 ) (x_2,y_2) (x2,y2),如果它们满足条件 x 1 y 2 − x 2 y 1 = 1 x_1y_2-x_2y_1=1 x1y2x2y1=1,它们在树上肯定可以以某种方式相邻。
    这条性质的证明方法与上一条很像,可以请读者们自行推导。
推论