Advertisement
kosievdmerwe

Untitled

Dec 10th, 2021
90
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 1.00 KB | None | 0 0
  1. MOD = 10 ** 9 + 7
  2.  
  3. class Solution:
  4.     def nthMagicalNumber(self, n: int, a: int, b: int) -> int:
  5.         if a > b:
  6.             a, b = b, a
  7.        
  8.         gcd_ = gcd(a, b)
  9.         if gcd_ > 1:
  10.             return (gcd_ * self.nthMagicalNumber(n, a // gcd_, b // gcd_)) % MOD
  11.        
  12.         def get_idx(m: int) -> int:
  13.             b_div = (m * a) // b
  14.             shared = m // b
  15.             return m + b_div - shared
  16.        
  17.         def get_next(m: int) -> int:
  18.             b_div = (m * a) // b
  19.             ans = min(m * a + a, b_div * b + b)
  20.             assert ans > m * a
  21.             return ans
  22.        
  23.         s, e, = 1, n + 1
  24.         while s < e:
  25.             m = (s + e) // 2
  26.             idx = get_idx(m)
  27.             if idx == n:
  28.                 return (m * a) % MOD
  29.             if idx + 1 == n:
  30.                 return get_next(m) % MOD
  31.            
  32.             if idx < n:
  33.                 s = m + 1
  34.             else:
  35.                 e = m
  36.            
  37.        
  38.        
  39.        
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement