878. Nth Magical Number
Hard
A positive integer is magical if it is divisible by either a
or b
.
Given the three integers n
, a
, and b
, return the nth
magical number. Since the answer may be very large, return it modulo 109 + 7
.
Example 1:
Input: n = 1, a = 2, b = 3
Output: 2
Example 2:
Input: n = 4, a = 2, b = 3
Output: 6
Example 3:
Input: n = 5, a = 2, b = 4
Output: 10
Example 4:
Input: n = 3, a = 6, b = 4
Output: 8
Constraints:
1 <= n <= 109
2 <= a, b <= 4 * 104
import sys
class Solution:
def nthMagicalNumber(self, n: int, a: int, b: int) -> int:
# Binary Search
MOD = 1000000007
low = 1
high = sys.maxsize # Python 2 sys.maxint
lcm = self.lcm(a,b) # So that we calculate it only once
# Performing Binary Search
while low < high:
mid = low + (high-low) // 2 # Mid of low and high
# If numbers divisible is < n , it means we have to go up to get close to nth
if self.termsCount(mid, a, b, lcm) < n:
low = mid+1
else:
high = mid
return low % MOD
def termsCount(self, num:int, a:int, b:int, lcm:int) -> int:
# Returns number of nums divisible by a or b
# Divisible by a + Divisible by b - Divisble by both (to prevent twice counting)
return (num // a) + (num // b) - (num // lcm)
def gcd(self, a:int, b:int) -> int:
if a == 0:
return b
return gcd(b%a, a)
def lcm(self, a:int, b:int) -> int:
return a*b // self.gcd(a,b)
Last updated