📜  [L,R]范围内与N相对质数的自然数计数(1)

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

题目介绍

求出在区间 [L, R] 之间与 N 互质的自然数个数。

解法一:暴力枚举

对于区间 [L, R] 中的每个自然数,都需要与 N 进行判断。判断方法是计算它们的最大公约数,如果最大公约数为 1,则该自然数与 N 互质。然后统计个数即可。

这种方法的时间复杂度为 O((R-L+1) * log(max(L,R,N))),显然是不可接受的。

解法二:欧拉函数

欧拉函数可以用来求出在某个正整数 n 的范围内与 n 互质的自然数的个数。具体地,欧拉函数 phi(n) 表示小于等于 n 的正整数中,有多少个与 n 互质的数,即:

phi(n) = n * (p1-1) * (p2-1) * ... * (pm-1) / (p1p2...*pm)

其中 p1,p2,...,pm 是 n 的所有质因数。

根据欧拉函数的定义,可以直接计算出 [L, R] 中与 N 互质的自然数个数:

def phi(n):
    res = n
    i = 2
    while i * i <= n:
        if n % i == 0:
            res = res // i * (i - 1)
            while n % i == 0:
                n //= i
        i += 1
    if n > 1:
        res = res // n * (n - 1)
    return res

def count_coprimes(L, R, N):
    res = phi(N)
    for i in range(L, R+1):
        if gcd(i, N) == 1:
            res += 1
    return res

其中 gcd 为计算最大公约数的函数,可以使用 math 包中的 gcd 函数。

此方法的时间复杂度为 O(log(N) + (R-L+1)),可以接受。

总结

本题可以使用欧拉函数来解决,时间复杂度为 O(log(N) + (R-L+1)),效率较高。