[
math
]
Leetcode 0780 Reaching Points
Problem statement
https://leetcode.com/problems/reaching-points/
Solution
The idea is start from the end, not from the beginning: in this way we always can make only one step: if we have (a, b) and a < b, then one reverse step is (a, b - a) and if a > b, it is (a - b, b). So, we start from the end and check step by step. To make it faster one reverse step can be done as (a%b, b%a), but in this way we need to make sure that we did not skip any solutions, like we have (100, 7) and we go directly to (2, 7), and we need to check positions (93, 7), (86, 7), ... (9, 7).
Complexity
Time complexity is O(log(sx) + log(sy)).
Code
class Solution:
def reachingPoints(self, sx, sy, tx, ty):
while tx > 0 and ty > 0:
if tx >= ty:
if sy == ty and (tx-sx)%ty == 0 and tx >= sx: return True
else:
if sx == tx and (ty-sy)%tx == 0 and ty >= sy: return True
tx, ty = tx%ty, ty%tx
return False