new_contents: # Time:  O(log(max(m, n)))
  # Space: O(1)
  
  # A move consists of taking a point (x, y) and transforming it to either (x, x+y) or (x+y, y).
  #
  # Given a starting point (sx, sy) and a target point (tx, ty),
  # return True if and only if a sequence of moves exists to transform the point (sx, sy) to (tx, ty).
  # Otherwise, return False.
  #
  # Examples:
  # Input: sx = 1, sy = 1, tx = 3, ty = 5
  # Output: True
  # Explanation:
  # One series of moves that transforms the starting point to the target is:
  # (1, 1) -> (1, 2)
  # (1, 2) -> (3, 2)
  # (3, 2) -> (3, 5)
  #
  # Input: sx = 1, sy = 1, tx = 2, ty = 2
  # Output: False
  #
  # Input: sx = 1, sy = 1, tx = 1, ty = 1
  # Output: True
  #
  # Note:
  # - sx, sy, tx, ty will all be integers in the range [1, 10^9].
  
  class Solution(object):
      def reachingPoints(self, sx, sy, tx, ty):
          """
          :type sx: int
          :type sy: int
          :type tx: int
          :type ty: int
          :rtype: bool
          """
          while tx >= sx and ty >= sy:
              if tx < ty:
                  sx, sy = sy, sx
                  tx, ty = ty, tx
              if ty > sy:
                  tx %= ty
              else:
                  return (tx - sx) % ty == 0
  
          return False
  
subject: Create reaching-points.py