POJ 3090 Visible Lattice Points(欧拉函数)

题目链接:http://poj.org/problem?id=3090

 

通过观察,如果一个点的坐标(x,y),当且仅当x与y互质,能看到。这是比较明显的。

那么就成了求2~N中每一个数的欧拉函数。

最后$ans=3+2\times \sum_{i=2}^{N} \phi(i)$。

 

根据欧拉函数的性质:

如果$p|n$且$p^2|n$,那么$\phi(n)= \phi(n/p)\times p$

如果$p|n$但$p^2$不能被$n$整除,那么$\phi(n)= \phi(n/p)\times (p-1)$

 

AC代码:

 1 #include<cstdio>
 2 #include<iostream>
 3 using namespace std;
 4 const int N=2005;
 5 int vis[N],prime[N],cnt,phi[N],sum[N];
 6 int n;
 7 void euler(){
 8     for(int i=2;i<=1000;i++){
 9         if(!vis[i]){
10             prime[++cnt]=i;
11             phi[i]=i-1;
12         }
13         for(int j=1;j<=cnt;j++){
14             if(i*prime[j]>1000) break;
15             vis[i*prime[j]]=1;
16             phi[i*prime[j]]=phi[i]*(i%prime[j]?prime[j]-1:prime[j]);
17             if(i%prime[j]==0) break;
18         }
19     }
20 }
21 int main(){
22     euler();
23     for(int i=2;i<=1000;i++) sum[i]=sum[i-1]+phi[i];
24     scanf("%d",&n);
25     for(int i=1;i<=n;i++){
26         int c;
27         scanf("%d",&c);
28         printf("%d %d %d\n",i,c,3+2*sum[c]);
29     }
30     return 0;
31 }
AC代码

 

posted @ 2020-11-03 16:24  dfydn  阅读(58)  评论(0编辑  收藏  举报