题意
给出一个N×NN\times NN×N的点阵,求出从(0,0)(0,0)(0,0)的点上最多能看到多少个点。
思路
我们可以先找一找规律发现当一个点的坐标xxx和yyy互质时它可以被看见。然后可以发现NNN每增长111,外面只多了一圈,由于yyy知道了,那么我们只用求出有多少个数和它互质,就会想到用欧拉函数,我们只计算一边的,因为对称,所以我们只用求一边的,答案就×2\times 2×2,一开始的周围333个特殊,最后加上去。
代码
#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);
}