874. 筛法求欧拉函数
摘要
Title: 874. 筛法求欧拉函数
Tag: 欧拉函数、线性筛
Memory Limit: 64 MB
Time Limit: 1000 ms
Powered by:NEFU AB-IN
874. 筛法求欧拉函数
-
题意
给定一个正整数 n,求 1∼n 中每个数的欧拉函数之和。
-
思路
可以利用线性筛把欧拉函数也筛出来
递推式为所以可以推出来:
- 当
i % primes[j] == 0
, - 当
i % primes[j] != 0
,
ps:
phi[1] = 1
别忘了初始化 -
代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33'''
Author: NEFU AB-IN
Date: 2022-03-10 20:28:12
FilePath: \ACM\Acwing\874.py
LastEditTime: 2022-03-10 20:28:13
'''
N = int(1e6 + 10)
st, phi, prime = [0] * N, [0] * N, [0] * N
def init(n):
res, cnt = 0, 0
phi[1] = 1
for i in range(2, n + 1):
if st[i] == 0:
prime[cnt] = i
phi[i] = i - 1
cnt += 1
j = 0
while i <= n // prime[j]:
st[i * prime[j]] = 1
if i % prime[j] == 0:
phi[i * prime[j]] = phi[i] * prime[j]
break
phi[i * prime[j]] = phi[i] * (prime[j] - 1)
j += 1
for i in range(1, n + 1):
res += phi[i]
print(res)
n = int(input())
init(n)