878. 第 N 个神奇数字 ----- 辗转相除求最大公因数、二分法查找指定值、逆向
一个正整数如果能被 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; } };
hello my world
本文来自博客园,作者:slowlydance2me,转载请注明原文链接:https://www.cnblogs.com/slowlydance2me/p/16914054.html