Leetcode 878. Nth Magical Number 第 N 个神奇数字(二分查找)

Leetcode 878. Nth Magical Number 第 N 个神奇数字:二分查找

    • 878. Nth Magical Number 第 N 个神奇数字
      • 题目描述
      • 示例:
      • 解答
      • 代码

878. Nth Magical Number 第 N 个神奇数字

题目描述

A positive integer is magical if it is divisible by either A or B.

Return the N-th magical number. Since the answer may be very large, return it modulo 10^9 + 7.

Note:

1 <= N <= 10^9
2 <= A <= 40000
2 <= B <= 40000

示例:

Example 1:

Input: N = 1, A = 2, B = 3
Output: 2
Example 2:

Input: N = 4, A = 2, B = 3
Output: 6
Example 3:

Input: N = 5, A = 2, B = 4
Output: 10
Example 4:

Input: N = 3, A = 6, B = 4
Output: 8

解答

这道题比较难,本来想用 O ( n ) O(n) O(n)的算法一个个找,直到找到第N个位置。但是这样效率有点低。

一种想法是用二分查找的办法做,给定一个数num,他是第几个神奇数字可以由如下这个公式得到:

n u m / A + n u m / B − n u m / l c m num/ A + num/ B - num/ lcm num/A+num/Bnum/lcm

其中lcmLeast Common Multiple,可以从 A ∗ B / g c d ( A , B ) A * B / gcd(A, B) AB/gcd(A,B)求得。

所以总的想法是找到最小的可以使如上等式等于Nnum就是解。

代码

class Solution {
public:
    int nthMagicalNumber(int N, int A, int B) {
    	long lcm = A * B / __gcd(A, B);
    	long l = 1;
    	long r = 1e15;
    	long mod = 1e9 + 7;
    	while (l < r) {
    		long  mid = (l + r) / 2;

    		if (mid / A + mid / B - mid / lcm < N) {
    			l  = mid + 1;
    		}
    		else r = mid;
    	}
    	return r % mod;

    }
};

你可能感兴趣的:(leetcode,二分查找,Leetcode,878.,Nth,Magical,Number,第,N,个神奇数字)