非常有意思的一个题目

首先我们要发现对于一种跳棋的状态,只有三种改变这种状态的方式:对于三元组(X,Y,Z)

 ---------------O----O--------------------O--

      X      Y        Z

X往右边移动:新三元组为(Y,2Y-X,Z)

Y往左边移动,新三元组为(2X-Y,X,Z)

Y往右边移动,新三元组为(X,2Y-Z,Y)

如果我们设两个相邻棋子之间的距离为(a,b)

那么有(a,b-a),(a,a+b),(b,a+b)

注意到向中间跳的时候,距离一定是(a,b-a),而且跳的方法是唯一的。

最终我们会跳到一个不能再跳的状态,即(t,t),不妨称之为这种状态的初态。显然这就是一个辗转相减求gcd的过程

那么我们可以发现,我们可以把它具体化为一个树中节点跳father的过程就很好理解了。

如果题目给出的始态和终态的初态相同,那么他们可以互相到达,

假设初态相同,由于初态可逆,那么至少可以通过初态互相到达。

如果初态不同,那么就绝对不能到达

假设初态不同但是它们可以到达,那么它们可以到达一个相同的状态,进而到达相同的初态,这与假设是矛盾的。

那么最小的操作次数即为树上路径的长度。

由于树很大,那么怎么求呢?二分答案。具体实现细节请看代码。