Leetcode(878)-第 N 個神奇數字


如果正整數可以被 A 或 B 整除,那么它是神奇的。

返回第 N 個神奇數字。由於答案可能非常大,返回它模 10^9 + 7 的結果。

示例 1:

輸入:N = 1, A = 2, B = 3
輸出:2

示例 2:

輸入:N = 4, A = 2, B = 3
輸出:6

示例 3:

輸入:N = 5, A = 2, B = 4
輸出:10

示例 4:

輸入:N = 3, A = 6, B = 4
輸出:8

提示:

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

思路:我一開始用了很原始的方式,將n從1開始加,判斷是否可以被兩個數的其中一個整除,如果可以就打入vector中,直到vector中的元素個數為N。不過這種方式不涉及腦子的,結果肯定是超出時間限制。

那么有沒有什么好的方法可以解決這個問題。我后來也想過不能每次加1,應該從最大公約最小公倍數之類的入手,但是最終沒能完整實現,下面是大神的解法

int gcd(int a,int b)//求最大公約數
    {
        return b==0?a:gcd(b,a%b);
    }
    int nthMagicalNumber(int N, int A, int B)
    {
        long long low=0,high=2000000000000000000L;
        int g=A*B/gcd(A,B);
        while(low<high)
        {
            long long mid=(low+high)/2;
            long long t=mid/A+mid/B-mid/g;
            if(t<N)
            {
                low=mid+1;
            }
            else
                high=mid;
        }
        return (int)(high%1000000007);
    }

建立一個大區間,通過二分法來求解,大區間的mid,可以知道mid左邊有mid/A個A,mid/B個B ,mid/G個AB的最小公倍數,mid/A+mid/B-mid/g就代表mid左邊有多少個滿足條件的數。然后二分法求解,直到找到一定個數的滿足條件的數。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM