function nthUglyNumber(n, a, b, c):
lab = lcm(a, b), lac = lcm(a, c), lbc = lcm(b, c)
labc = lcm(lab, c)
left, right = 1, 2 × 10^9
while left < right:
mid = (left + right) // 2
count = mid/a + mid/b + mid/c - mid/lab - mid/lac - mid/lbc + mid/labc
if count < n: left = mid + 1
else: right = mid
return left
Time: O(log(max answer)). Space: O(1).