求一共多少神奇数字 n // a + n // b - n // lcm这样我们就能得到目前一共多少神奇数字了。
二分查找n
代码
Python
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
classSolution: defnthMagicalNumber(self, n: int, a: int, b: int) -> int: import math MOD = 10 ** 9 + 7
defgcd(a, b): return a if b == 0else gcd(b, a % b)
lcm = math.lcm(a, b) l, r = 0, min(a, b) * n while l + 1 < r: # (l, r)开区间 mid = (r - l >> 1) + l if (mid // a + mid // b) - mid // lcm >= n: r = mid # 范围缩小到(l, mid) else: l = mid # 范围缩小到(mid, r) return r % MOD
classSolution { public: intnthMagicalNumber(int n, int a, int b){ constlong MOD = 1000000000 + 7; long c = lcm(a, b); long l = 0, r = (long)min(a, b) * n; while (l + 1 < r) { long mid = (r - l >> 1) + l; if (mid / a + mid / b - mid / c >= n) { r = mid; } else { l = mid; } } return r % MOD; }
longgcd(long a, long b) { return b == 0 ? a : gcd(b, a % b); } longlcm(long a, long b) { return (a * b) / gcd(a, b); } };