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

📅  最后修改于: 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)。
  • 第二层循环只会遍历质数,不会遍历合数,所以其时间复杂度不会超过O(loglogn)。由于最外层的范围是[n,R],所以最多只会有O((R-n+1)loglogR)个数需要遍历。

因此,该算法的总时间复杂度为O(n + (R-n+1)loglogR)。

参考文献