[
math
binary search
]
Leetcode 0878 Nth Magical Number
Problem statement
https://leetcode.com/problems/nth-magical-number/
Solution 1
Imagine A = 6
and B = 10
, then we have several first numbers: [6, 10, 12, 18, 20, 24, 30]
. Note, than after they will be repeated with same pattern, added +30
, +60
and so on. In general, there will be lcm(A, B)//A + lcm(A, B)//B - 1
numbers in group, where lcm is least common multiplier. Then we just find number with index N
: find where in period it is and how many periods we make.
Complexity
Time complexity is O(A + B)
.
Code
class Solution:
def nthMagicalNumber(self, N, A, B):
lcm, Q = A*B//gcd(A,B), 10**9 + 7
cand = sorted([A*i for i in range(1,lcm//A)] + [B*i for i in range(1,lcm//B+1)])
m = len(cand)
return (cand[(N-1)%m] + lcm*((N-1)//m)) % Q
Solution 2
There is also Binary search approach: answer for our problem is increasing, when we increase N
: so we can evaluate in O(1)
how many magical numbers we have before given number x
, using inclusion-exclusion formula.
Complexity
Total complexity is O(log(N) + log(A + B))
.
Code
class Solution:
def nthMagicalNumber(self, N, A, B):
lcm, Q = A*B//gcd(A,B), 10**9 + 7
beg, end = 0, N * min(A,B)
while beg < end:
mid = (beg + end)//2
if mid//A + mid//B - mid//lcm < N:
beg = mid + 1
else:
end = mid
return beg % Q