AcWing 874. 筛法求欧拉函数 线性筛法
原题链接
简单
作者:
皓首不倦
,
2020-09-03 11:51:58
,
所有人可见
,
阅读 378
'''
利用线性筛法求每一个数值的欧拉函数数值
'''
# 筛选出1-N中的质数
def get_prime(N):
prime_vals = []
phi_vals = [0]*(N+1) # 每一个数的欧拉函数数值
phi_vals[1] = 1
flag = [True] * (N+1) # 是否是质数标记
# 下面是线性筛法选质数,每个数的欧拉函数数值被其最小的质因数更新
for val in range(2, N+1):
if flag[val]:
prime_vals.append(val)
phi_vals[val] = val-1
for p_val in prime_vals:
if val * p_val > N:
break
flag[val * p_val] = False
if val % p_val == 0:
# p_val能整除val, p_val*val 的欧拉函数相对val的欧拉函数就是多乘了一项p_val
phi_vals[val * p_val] = phi_vals[val] * p_val
break
else:
# p_val不能能整除val, p_val*val 的欧拉函数相对val的欧拉函数就是多乘了一项p_val * (1- 1/p_val)
phi_vals[val * p_val] = phi_vals[val] * (p_val-1)
return sum(phi_vals)
n = int(input())
print(get_prime(n))