Leetcode 878. Nth Magical Number 第 N 个神奇数字:二分查找
878. Nth Magical Number 第 N 个神奇数字
题目描述
A positive integer is magical if it is divisible by either A or B.
Return the N-th magical number. Since the answer may be very large, return it modulo 10^9 + 7.
Note:
1 <= N <= 10^9
2 <= A <= 40000
2 <= B <= 40000
示例:
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
解答
这道题比较难,本来想用 O ( n ) O(n) O(n)的算法一个个找,直到找到第N个位置。但是这样效率有点低。
一种想法是用二分查找的办法做,给定一个数num,他是第几个神奇数字可以由如下这个公式得到:
n u m / A + n u m / B − n u m / l c m num/ A + num/ B - num/ lcm num/A+num/B−num/lcm
其中lcm是Least Common Multiple,可以从 A ∗ B / g c d ( A , B ) A * B / gcd(A, B) A∗B/gcd(A,B)求得。
所以总的想法是找到最小的可以使如上等式等于N的num就是解。
代码
class Solution {
public:
int nthMagicalNumber(int N, int A, int B) {
long lcm = A * B / __gcd(A, B);
long l = 1;
long r = 1e15;
long mod = 1e9 + 7;
while (l < r) {
long mid = (l + r) / 2;
if (mid / A + mid / B - mid / lcm < N) {
l = mid + 1;
}
else r = mid;
}
return r % mod;
}
};