如何找到转换(a,b)到(x,y)的步骤数

时间:2017-03-08 16:02:21

标签: algorithm language-agnostic

给出2个数字a = 1且b = 1。

在每个步骤中,您可以执行以下操作之一:

  1. 一个+ = B;
  2. B + =一个;
  3. 如果可以将a转换为x和b转换为y,请找到所需的最小步骤

    x和y可以任意大(大于10 ^ 15)

    到目前为止,我的方法只是做一个递归回溯,其复杂度(太大)将在O(2 ^ min(x,y))附近。 DP不会做,因为状态可能超过10 ^ 15。

    有什么想法吗?是否有解决这个问题的数论?

    P.S。这不是作业。

2 个答案:

答案 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算法,将操作数作为副产品(将所有商品计算在一起并减去一个)。