AcWing 201. 可见的点
原题链接
简单
作者:
皓首不倦
,
2020-09-07 10:51:30
,
所有人可见
,
阅读 385
'''
可见的点的特点是两个坐标互质,利用线性筛法从2到N求每个数的欧拉函数,然后求欧拉函数总和
基于对称性,再乘以2,最后再加(1,1), (0, 1), (1, 0)三个特殊点即可
'''
def get_eular_vals(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 phi_vals
eular_vals = ans = get_eular_vals(1000)
n = int(input())
for i in range(1, n+1):
val = int(input())
print(i, val, sum(eular_vals[2:val+1])*2+3)