AcWing 874. 筛法求欧拉函数
原题链接
简单
作者:
柠檬茶去冰
,
2024-11-22 21:15:12
,
所有人可见
,
阅读 1
N = 1000010
primes = [0]*N #p质数
phi = [0]*N #phi欧拉函数
st = [False]*N #是否被筛掉
def get_eulers(n):
phi[1]=1
cnt=0 #质数的下标
for i in range(2,n+1): #线性筛
if not st[i]: #如果不在,说明是质数
primes[cnt]=i #记录在p(下标(cnt)和值(i))
cnt+=1
phi[i]=i-1
j=0
while primes[j]<=n//i:
st[primes[j]*i]=True
if i%primes[j]==0: #如果是质因子
phi[primes[j]*i]=phi[i]*primes[j] #phi就可以提出去乘
break
phi[primes[j]*i]=phi[i]*(primes[j]-1) #如果不是,phi就要*p[j]-1
j+=1
res=0
for i in range(1,n+1):
res+=phi[i]
return res
n=int(input())
print(get_eulers(n))