给出2个数字a = 1且b = 1。
在每个步骤中,您可以执行以下操作之一:
如果可以将a转换为x和b转换为y,请找到所需的最小步骤
x和y可以任意大(大于10 ^ 15)
到目前为止,我的方法只是做一个递归回溯,其复杂度(太大)将在O(2 ^ min(x,y))附近。 DP不会做,因为状态可能超过10 ^ 15。
有什么想法吗?是否有解决这个问题的数论?
P.S。这不是作业。
答案 0 :(得分:3)
鉴于你达到某些(x,y),唯一的方法就是将较小的值添加到现在较大的值中。说x> y,那么唯一可能的先前状态是x-y,y。
另请注意,到达x,y的步骤数与获得y,x相同。 所以您正在寻找的解决方案就像
steps(x,y):
if x < y: return steps(y, x)
if y == 1: return x - 1
if y == 0: throw error # You can't get this combination.
return x / y + steps (y, x % y)
答案 1 :(得分:0)
换句话说,在Calkin--Wilf tree中找到节点的深度。如果gcd(a,b)= 1,则节点存在。您可以修改gcd算法,将操作数作为副产品(将所有商品计算在一起并减去一个)。