题目链接:http://poj.org/problem?id=3090
通过观察,如果一个点的坐标(x,y),当且仅当x与y互质,能看到。这是比较明显的。
那么就成了求2~N中每一个数的欧拉函数。
最后$ans=3+2 imes sum_{i=2}^{N} phi(i)$。
根据欧拉函数的性质:
如果$p|n$且$p^2|n$,那么$phi(n)= phi(n/p) imes p$
如果$p|n$但$p^2$不能被$n$整除,那么$phi(n)= phi(n/p) imes (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 ",i,c,3+2*sum[c]); 29 } 30 return 0; 31 }