题意
给出一个 N × N N\times N N×N的点阵,求出从 ( 0 , 0 ) (0,0) (0,0)的点上最多能看到多少个点。
思路
我们可以先找一找规律发现当一个点的坐标 x x x和 y y y互质时它可以被看见。然后可以发现 N N N每增长 1 1 1,外面只多了一圈,由于 y y y知道了,那么我们只用求出有多少个数和它互质,就会想到用欧拉函数,我们只计算一边的,因为对称,所以我们只用求一边的,答案就 × 2 \times 2 ×2,一开始的周围 3 3 3个特殊,最后加上去。
代码
#include<cstdio>
int N;
long long ans;
long long phi[100001];
int main() {
scanf("%d", &N);
if (N == 1) {
printf("0");
return 0;
}
for (int i = 2; i < N; i++) phi[i] = i;
for (int i = 2; i < N; i++) {
if (phi[i] == i)
for (int j = i; j <= N; j += i)
phi[j] = phi[j] * (i - 1) / i;
ans += phi[i];
}
printf("%lld", ans * 2 + 3);
}