一个正整数如果能被 a 或 b 整除,那么它是神奇的。
给定三个整数 n , a , b ,返回第 n 个神奇的数字。因为答案可能很大,所以返回答案 对 109 + 7 取模 后的值。
示例 1:
输入:n = 1, a = 2, b = 3
输出:2
示例 2:
输入:n = 4, a = 2, b = 3
输出:6
提示:
1 <= n <= 109
2 <= a, b <= 4 * 104
通过次数7,665提交次数23,182
来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/nth-magical-number
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
将待求值作为因变量X 题意转换成 待求指定函数值Y:
令 f(x) 等于所有小于等于 x 的神奇数字的数量,f(x) 是单调递增的。所以我们可以使用二分查找找到第一个使 f(x) = n 的 x 的值。x 即为答案。
class Solution {
typedef long long LL;
const int MOD = 1e9 + 7;
public:
int nthMagicalNumber(int n, int a, int b) {
int lcm = a / gcd(a, b) * b; // 辗转相除法
//二分法
LL l = 0;
LL r = n * 1ll * min(a, b);
while (l < r) {
LL mid = (l + r) >> 1;
LL cnt = mid / a + mid / b - mid / lcm;
if (cnt >= n) {
r = mid;
} else {
l = mid + 1;
}
}
return (int) (l % MOD);
}
private:
int gcd(int a, int b) {
return b ? gcd(b, a % b) : a;
}
};