• 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左边有多少个满足条件的数。然后二分法求解,直到找到一定个数的满足条件的数。

  • 相关阅读:
    c# 利用反射设置属性值
    C#中扩展方法
    Python与Ruby比较
    Python 学习笔记(半ZZ半自己写)
    c# 写的一个类帮助器(动态生成类 动态类 动态属性)
    c#学习python
    LBS中从数据库查询某经纬度2KM范围内的数据 针对大数据量的性能优化
    隐藏ToString等系统自带方法
    C#命名规范
    SQL Server 数值四舍五入,小数点后保留2位
  • 原文地址:https://www.cnblogs.com/mini-coconut/p/9387796.html
Copyright © 2020-2023  润新知