POJ 3090 Visible Lattice Points 【欧拉函数】

时间:2022-12-13 04:15:38

<题目链接>

题目大意:

POJ 3090 Visible Lattice Points 【欧拉函数】给出范围为(0, 0)到(n, n)的整点,你站在(0,0)处,问能够看见几个点。

解题分析:
很明显,因为 (1 ≤ N ≤ 1000) ,所以无论 N 为多大,(0,1),(1,1),(1,0)这三个点一定能够看到,除这三个点以外,我们根据图像分析可得,设一个点的坐标为(x,y) ,那么只有符合gcd(x,y)=1的点才能被看到。又因为 (0,0)---(n,n)对角线两端的点对称,所以我们只需算一边即可,而一边的点数根据欧拉函数可得: $\sum_{i=2}^{n}\varphi{(i)}$

所以最终的点数为:$$2*\sum_{i=2}^{n}\varphi{(i)}+3$$

#include <cstdio>
#define N int(1e3+10)
typedef long long ll;
int euler[N];
void init(){
euler[]=;
for(int i=;i<N;i++)euler[i]=i;
for(int i=;i<N;i++)
if(euler[i]==i)
for(int j=i;j<N;j+=i)
euler[j]=euler[j]/i*(i-);
}
int main(){
init();
int T,ncase=;scanf("%d",&T);
while(T--){
int n;scanf("%d",&n);
ll ans=;
for(int i=;i<=n;i++)ans+=euler[i];
printf("%d %d %d\n",++ncase,n,*ans+);
}
}

2019-02-12