非常有意思的一个题目
首先我们要发现对于一种跳棋的状态,只有三种改变这种状态的方式:对于三元组(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的过程就很好理解了。
如果题目给出的始态和终态的初态相同,那么他们可以互相到达,
假设初态相同,由于初态可逆,那么至少可以通过初态互相到达。
如果初态不同,那么就绝对不能到达
假设初态不同但是它们可以到达,那么它们可以到达一个相同的状态,进而到达相同的初态,这与假设是矛盾的。
那么最小的操作次数即为树上路径的长度。
由于树很大,那么怎么求呢?二分答案。具体实现细节请看代码。