📜  门| GATE-CS-2003 |问题2(1)

📅  最后修改于: 2023-12-03 14:58:25.780000             🧑  作者: Mango

题目描述:

给定一个正整数n,你需要计算从1到n之间的所有互质数对(A, B),其中1 <= A < B <= n。两个数A、B互质当且仅当它们的最大公约数为1。例如,对于n = 7,互质数对包括(1, 2), (1, 3), (1, 4), (1, 5), (1, 6), (2, 3), (2, 5), (2, 7), (3, 4), (3, 5), (4, 5), (4, 7), (5, 6)和(6, 7)。

具体来说,编写一个函数countCoprimePairs(n),它返回从1到n之间的所有互质数对(A, B)的数量。例如, countCoprimePairs(7)应返回14。

注意,由于输入较大,可能需要优化算法以避免超时。

解题思路:

首先,对于一个正整数x,它与y的最大公约数为1,当且仅当x与y互质。因此,问题可以转化为对于每个数i (1 <= i <= n),找到所有与i互质的数字对。对于每个数字i,我们可以利用欧拉函数phi(i)来计算与i互质的数字数量。phi(i)表示小于等于i的数字中与i互质的数字数量。因此,如果我们枚举数字i,将phi(i)的结果相加,就可以得到从1到n之间所有互质数字的数量。最后,由于每个数字对都计算了两次,因此需要将结果除以2。

代码实现:

def countCoprimePairs(n: int) -> int:
    phi = [i for i in range(n + 1)] # 初始化phi数组
    for i in range(2, n + 1):
        if phi[i] == i: # i是质数
            for j in range(i, n + 1, i):
                phi[j] = phi[j] // i * (i - 1) # 更新phi[j]的值
    coprime_pairs = sum(phi) - n # 计算互质数字对数量
    return coprime_pairs // 2 # 除以2得到真正的数字对数量

该代码的时间复杂度为O(n log log n),空间复杂度为O(n)。