You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
32 lines
866 B
32 lines
866 B
2 years ago
|
package class_2023_01_1_week;
|
||
|
|
||
|
// 一个正整数如果能被 a 或 b 整除,那么它是神奇的。
|
||
|
// 给定三个整数 n , a , b ,返回第 n 个神奇的数字。
|
||
|
// 因为答案可能很大,所以返回答案 对 10^9 + 7 取模 后的值。
|
||
|
// 测试链接 : https://leetcode.cn/problems/nth-magical-number/
|
||
|
public class Code02_NthMagicalNumber {
|
||
|
|
||
|
public static int nthMagicalNumber(int n, int a, int b) {
|
||
|
// 求a和b的最小公倍数
|
||
|
long lcm = (long) a / gcd(a, b) * b;
|
||
|
long ans = 0;
|
||
|
// l = 0
|
||
|
// r = (long) n * Math.min(a, b)
|
||
|
for (long l = 0, r = (long) n * Math.min(a, b), m = 0; l <= r;) {
|
||
|
m = (l + r) / 2;
|
||
|
if (m / a + m / b - m / lcm >= n) {
|
||
|
ans = m;
|
||
|
r = m - 1;
|
||
|
} else {
|
||
|
l = m + 1;
|
||
|
}
|
||
|
}
|
||
|
return (int) (ans % 1000000007);
|
||
|
}
|
||
|
|
||
|
public static int gcd(int a, int b) {
|
||
|
return b == 0 ? a : gcd(b, a % b);
|
||
|
}
|
||
|
|
||
|
}
|