【算法】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.

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

Note:

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

给出 N A B 三个数字,求出第 N 个神奇数字,神奇数字可以被 A 或者 B 整除。

解题思路

假设神奇数字时 M,则 M 是 A 的第 M / A 个倍数,M 是 B 的第 M / B 个倍数,由于 A、B 存在最小公倍数 LCM ,所以 M 即为 A 和 B 的第 M / A + M / B + M / LCM 个神奇数字。
所以思路即为:

  • 先求出最小公倍数 LCM
  • 然后二分寻找第 N 个神奇数字,以 M / A + M / B + M / LCM < N 为比较条件

代码实现

Runtime: 8 ms
Memory: 20.8 MB

// 当 N 为 1 时,返回 A B 的较小值
        if N == 1 {
            return min(A, B)
        }
        // a b tmp 用于辗转相除求最大公约数
        var a = A,b = B,tmp = 0
        while (b > 0)
        {
            tmp = a
            a = b
            b = tmp % b
        }
        // 最大公约数为 a,最小公倍数为 lcm
        let lcm = A * B / a
        // 二分搜索的左右边界
        var l = 2,r = Int(1e14)
        while (l < r)
        {
            // 中值 m
            let m = (l + r) / 2;
            // m / A + m / B - m / lcm 得出的结果为 m 是第几个神奇数字
            if m / A + m / B - m / lcm < N
            {
                l = m + 1
            }
            else
            {
                r = m
            }
        }
        return Int(l % Int(1e9 + 7))

代码地址:https://github.com/sinianshou/EGSwiftLearning

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 在C语言中,五种基本数据类型存储空间长度的排列顺序是: A)char B)char=int<=float C)ch...
    夏天再来阅读 4,066评论 0 2
  • 小学奥数的知识点约 80个,总体上可以分为五大类。数论和行程问题是小 学奥数学习中的重点也是难点。 一、 计算能力...
    ADolphin阅读 8,700评论 1 3
  • FLutter作为一个比RN更高效优秀的移动开发SDK,值得有追求的移动开发者们去学习研究。下面是我初次阅读Flu...
    路在脚下了阅读 528评论 0 0
  • 半夏的星空格外的美,满天的星星不停地闪烁着,看得人眼花缭乱,但总有一颗是最亮的,妈妈说过,每一个人看到的最亮的星星...
    路一漫阅读 901评论 1 4
  • 今天的最后7分钟来更文,然而要做的图还没有做完,老母亲已经困的要睁不开眼睛了,做完这个图,应该是今年最后一张了。 ...
    喵皇后阅读 128评论 0 0

友情链接更多精彩内容