📌  相关文章
📜  找到给定范围内某对可能的最大 GCD [L, R](1)

📅  最后修改于: 2023-12-03 15:25:50.878000             🧑  作者: Mango

找到给定范围内某对可能的最大 GCD [L, R]
题目描述

给定一个区间 [L, R],找到可能的最大公约数(GCD)对。

解法

考虑到最大公约数的性质,如果 a 和 b 的最大公约数是 d,那么 a 和 x*b 的最大公约数也是 d。因此,我们只需要找到区间中的最大数 x,满足 x 可以分解成区间中任意两数的最大公约数,则这个最大公约数就是区间 [L, R] 的可能的最大 GCD。

具体地,我们枚举所有的可能的最大公约数 d,从 R/d 到 L/d 的顺序枚举所有的数 x,看能否找到两个数,使得它们的最大公约数是 d。

代码

下面是可能的最大 GCD 的 Python3 实现:

from math import gcd

def max_gcd(L, R):
    """
    :type L: int
    :type R: int
    :rtype: int
    """
    for d in range(R, 0, -1):
        cnt = 0
        for x in range(R//d, L//d + 1):
            if cnt == 2:
                break
            a = x*d
            if L <= a <= R:
                cnt += 1
                if cnt == 2:
                    return d
                continue
            b = R // (R//a)
            if a <= b*d and gcd(R, b*d) == d:
                cnt += 1
                if cnt == 2:
                    return d
性能分析

这个算法的时间复杂度是 O((R-L)logR),其中 logR 是计算最大公约数的复杂度。所以该算法可以通过本题。