首页 > 其他分享 >878. 第 N 个神奇数字 ----- 辗转相除求最大公因数、二分法查找指定值、逆向

878. 第 N 个神奇数字 ----- 辗转相除求最大公因数、二分法查找指定值、逆向

时间:2022-11-22 08:55:48浏览次数:54  
标签:gcd int LL mid 相除 二分法 神奇 公因数

一个正整数如果能被 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;
    }
};

 

标签:gcd,int,LL,mid,相除,二分法,神奇,公因数
From: https://www.cnblogs.com/slowlydance2me/p/16914054.html

相关文章

  • 792. 匹配子序列的单词数 ----- find()暴力、队列分桶查询、二分法哈希
    给定字符串s 和字符串数组 words,返回  words[i] 中是s的子序列的单词个数 。字符串的子序列是从原始字符串中生成的新字符串,可以从中删去一些字符(可以是none)......
  • PHP二分法
    classHalfFind{/***@desc二分法查找效率老高了前提:必须是有序的数组*@desc二分法时间复杂度为O(logn)**@param$nums*......
  • 洛谷P8849 『JROI-7』hibernal 二分法题解
    题目链接题目大意:交互题,给定N=2或18或64或512或1000,其中你要通过19次以内的询问在数列1-N中找到给定的未知的两个数x和y(本题解中设x<y),每次询问......
  • 自定义函数二分法查找,数组问题
    intfind(intarr1[],intx,inty){intleft=0;intright=y-1;while(right>=left){if(x>arr1[(left+right)/2])left=(left+right)/2+1;elseif(x<arr1[(l......
  • 最大公约数 C/C++ leetcode , 辗转相除,更相减损
    #include <iostream>using namespace std;// 辗转相除法求最大公约数,用大的模小的,然后用除数模余数,该接口在新版的C++17的numeric 包中也有int gcd1(int a ,......
  • 二分法
    三、二分法1.整数二分的本质:将整个区间一分为二。在这两个区间,选择一个一定能保证里面有答案的区间,区间代码模板如下。并且解决左右端点更新的问题程序中不要同时出现......
  • 最小装载(二分法)字符串
    1011.在D天内送达包裹的能力左值为数组中最大的元素(最少要能把它装下);右值为数组元素之和;while(left<right){intmid=(right+left)/2;intneed=1,cur=......
  • 欧几里得(辗转相除法)求两个数最大公约数
    #include<stdio.h>intEA(inta,intb)//欧几里得算法{intremainder;intmiddle;if(a<b)//a,b交换值{b=a+b;a......
  • 算法之二分法(求根号一个数)
    1.二分法:指的是在一个区间内无限迫近一个数。2.代码解释:如果说需要排除01两个特殊值,那么需要把左指针的值变为1。左右指针是指向某一个数,而不是固定的,注意在i......
  • 29. 两数相除
    29.两数相除题解:a/b=y等价于b>a-(b*y)>0,只要求出减了多少次b就好了。一个一个地减b,效率太低了,最坏情况下,a=2^31-1,b=1,超时;应该先预......