树如下:
(1,1)
/ \
(2,1) (1,2)
/ \ / \
(3,1)(2,3) (3,2)(1,3)
and onward
根是(1,1),树中的所有值都是元组。
Where (x,y) is an element of the tree:
The leftChild will be (x+y,y)
The rightChild will be (x,x+y)
我正在构建一个找到距离根(1,1)的距离的函数。我不能从头开始构建树,因为它太耗费时间。
我发现距离要搜索的元组有1个距离,我们必须用min减去最大值。我们可以向后工作。
1 2
(3,2)->(1,2)->(1,1)
(3,2)->(3-2,2) = (1,2)->(1,2-1) = (1,1)
given this is always true:
if x > y:
newtuple = (x-y,y)
distance += 1
else if y > x:
newtuple = (x,y-x)
distance += 1
然而,因为可能的测试用例甚至可以达到x = 10 ^ 50,这甚至太慢了。
所以我发现正式找到x的减法量,反之亦然,以得到x> y变为y< x,反之亦然,直到(x,y)=(1,1)。
所以X - Y(一定次数,比如z)会使x小于y ... X - Y * z = y 通过代数找到z ... z =(Y-X)/( - Y)
到目前为止,这是我的代码:
from decimal import Decimal
import math
def answer(M,F):
M = int(M)
F = int(F)
i = 0
while True:
if M == 1 and F == 1:
return str(i)
if M > F:
x = math.ceil((F-M)/(-F))
M -= F*x
elif F > M:
x = math.ceil((M-F)/(-M))
F -= M*x
else:
if F == M and F != 1:
return "impossible"
i += x
if M < 1 or F < 1:
return "impossible"
return str(i)
并没有传递一些未知的测试用例,但却通过了我能想到的所有测试用例。哪些测试用例可能会失败?我的代码在哪里错了?
P.S。使用十进制模块,只是从代码中删除,以使更多可读。
答案 0 :(得分:0)
地板划分不允许丢失,但可能是-1错误,我考虑下面的代码。
def answer(M,F):
M = int(M)
F = int(F)
i = 0
while True:
if M == 1 and F == 1:
return str(i)
if M > F:
x = F-M
x = x//(-F)
if F < M-(F*x):
x += 1
M -= F*x
elif F > M:
x = M-F
x = x//(-M)
if M < F-(M*x):
x += 1
F -= M*x
else:
if F == M and F != 1:
return "impossible"
i += x
if M < 1 or F < 1:
return "impossible"
return str(i)