📜  数组中互质对的数量(1)

📅  最后修改于: 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],则有以下互质集合:

  • 对于2,与之互质的数为3, 5
  • 对于3,与之互质的数为2, 4, 5, 6
  • 对于4,与之互质的数为3, 5
  • 对于5,与之互质的数为2, 3, 4, 6
  • 对于6,与之互质的数为5

他们的交集为{5},所以数组A中有1个互质对。