题意
给出一个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);
}
本文探讨了在一个N×N的点阵中,从(0,0)位置最多能观察到多少个点的问题。通过发现当点的坐标x和y互质时,该点可以被看见的规律,引入了欧拉函数的概念来计算与特定坐标互质的点的数量。最终,通过计算一边的互质点数并乘以2,再考虑初始特殊情况,得出了解决方案。
405

被折叠的 条评论
为什么被折叠?



