📅  最后修改于: 2023-12-03 15:25:50.878000             🧑  作者: Mango
给定一个区间 [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 是计算最大公约数的复杂度。所以该算法可以通过本题。