fork(1) download
  1.  
  2.  
  3. def egcd(a, b):
  4. if not (a and b):
  5. return (1 if a else 0, b if b else 0, a + b)
  6. d, r = divmod(a, b)
  7. x1, y1, g = egcd(b, r)
  8. return (y1, x1 - y1 * d, g)
  9.  
  10. def solve(a, b, c):
  11. """
  12. return (x, y) s.t. ax + by = c
  13. x >= 0, y >= 0
  14. """
  15. x1, y1, g = egcd(a, b)
  16. if c % g != 0:
  17. raise ValueError("Impossible")
  18.  
  19. x = x1 * c / g
  20. y = y1 * c / g
  21.  
  22. swapped = False
  23.  
  24. if x < 0:
  25. swapped = True
  26. x, y = y, x
  27. a, b = b, a
  28.  
  29. if y < 0:
  30. u = a / g
  31. v = b / g
  32.  
  33. k = x / v
  34.  
  35. x -= k * v
  36. y += k * u
  37. if y < 0:
  38. raise ValueError("Impossible for positive x, y")
  39. return (y, x) if swapped else (x, y)
  40.  
  41.  
  42. print solve(18, 15, 198)
  43.  
Success #stdin #stdout 0.01s 9024KB
stdin
Standard input is empty
stdout
(1, 12)