📅  最后修改于: 2023-12-03 15:26:10.931000             🧑  作者: Mango
在一个长度为n的数组中,如果两个数i,j(i<j)的最大公约数为1,则称它们为互质对。现在给定一个数组A,请你求出A中有多少个互质对。
对于一个数i,我们需要找出与它互质的所有数,然后计算它们的个数。我们可以通过求i的因数,再筛去其中的非互质数,得到与i互质的数的集合。然后对于数组中的每一个数,我们都可以得到一个互质数的集合。最后,我们只需要求出所有这些互质数集合两两之间的交集,就可以得到所有互质对。
具体实现时,可以使用欧拉筛来求每一个数的所有因数。对于每一个互质集合,可以用set存储,并对set进行交集运算。
def gcd(a, b):
"""最大公约数"""
if b == 0:
return a
return gcd(b, a % b)
def get_factors(n):
"""获取n的所有因数"""
factors = set()
for i in range(1, int(n ** 0.5) + 1):
if n % i == 0:
factors.add(i)
factors.add(n // i)
return factors
def count_coprime_pairs(arr):
"""计算数组中互质对的个数"""
# 求每个数的因数集合
factors = [get_factors(n) for n in arr]
# 遍历数组,计算每一个数的互质数集合
coprime_sets = []
for i in range(len(arr)):
coprime_set = set()
for j in range(i+1, len(arr)):
if gcd(arr[i], arr[j]) == 1:
coprime_set.add(arr[j])
coprime_sets.append(coprime_set)
# 求所有互质集合的交集
result = set(factors[0]) - {1}
for coprime_set in coprime_sets:
result = result & coprime_set
return len(result)
假设数组A为[2, 3, 4, 5, 6],则有以下互质集合:
他们的交集为{5},所以数组A中有1个互质对。