📅  最后修改于: 2023-12-03 14:59:08.083000             🧑  作者: Mango
给定两个正整数L,R,以及一个正整数N,计算出[L,R]范围内与N相对质数的自然数数量。
欧拉筛法(Sieve of Euler)是一种用于线性筛选出小于某个正整数n的质数的算法。在该算法中,每个合数仅被其最小的质因数筛除,所以每个数只会被筛选一次,复杂度为O(n)。
根据欧拉筛法,在[L,R]范围内筛选相对质数之和的代码如下:
def EulerSieve(L, R, N):
primes = []
phi = [0 for _ in range(R+1)]
phi[1] = 1
for i in range(2, R+1):
if phi[i] == 0:
phi[i] = i-1
primes.append(i)
for j in range(len(primes)):
if i * primes[j] > R:
break
if i % primes[j] == 0:
phi[i * primes[j]] = phi[i] * primes[j]
break
else:
phi[i * primes[j]] = phi[i] * (primes[j]-1)
res = 0
for k in range(L, R+1):
if phi[k] % N == 0:
res += 1
return res
输入样例1:
L = 1, R = 10, N = 3
输出样例1:
7
输入样例2:
L = 1, R = 10, N = 2
输出样例2:
4
欧拉筛法的时间复杂度为O(n),具体分析如下:
因此,该算法的总时间复杂度为O(n + (R-n+1)loglogR)。