878. Nth Magical Number

理解
很典型的考察Nth的问题,主要是找到需要二分的对象,此题是找到Nth magic number,二分的对象明显是数的范围;
从题目的限制条件来看,二分的左值为2(min(A,B)),右值为 N*max(A,B) = 1e14

思路
利用二分进行查找,对进行查找的空间,计算存在的magic number的个数;

重点
1、二分左右值的确定
2、查找给定范围内magic number的个数时,使用mid/A + mid/B - mid/((A * B)/__gcd(A, B));使用到了最大公约数求最小公倍数;

代码

class Solution {
public:
    int nthMagicalNumber(int N, int A, int B) {
        long mod =  1e9 + 7;
        long left = 2;
        long right = 1e14;
        while(left < right){
            long mid = (left + right)/2;
            long ret = mid/A + mid/B - mid/lcm(A,B);
            if(ret < N){
                left =  mid + 1;
            }else{
                right = mid;
            }
        }
        return left % mod;
    }
    
    int gcd(int a, int b){
        if(a < b){
            swap(a, b);
        }
        if(b == 0){
            return a;
        }else{
            return gcd(b, a%b);
        }
    }
    int lcm(int a, int b){
        return a*b/gcd(a, b);
    }
};

解题参考链接