📅  最后修改于: 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)),效率较高。