poj-3090 Visible Lattice Point 求前n欧拉函数值的和

来源:互联网 发布:mac浏览器打开网页慢 编辑:程序博客网 时间:2024/05/21 18:44

题意:从(0,0)到(x,y)作一条线段,如果这条线段不经过其他的整点,那么称(x,y)是可见的。给出正方形的边n输出该平面所有可见的点。

分析:从(0,0)到(x,y)不经过其他整点,也即是说x,y是不可约的。x,y是互质的,该问题就转化为1到n内互质的数的对数,所以可通过求前n个欧拉函数值的和来确定。

AC代码:

#include<iostream>#include<cstdio>#include<cstring>using namespace std ;const int N=1005;int phi[N];void PHI(){for(int i=1;i<=N;i++){if(i&1) phi[i]=i;else phi[i]=i/2;}for(int i=3;i<=N;i+=2){if(phi[i]==i)for(int j=i;j<=N;j+=i) phi[j]=phi[j]/i*(i-1);}for(int i=2;i<=N;i++){phi[i]+=phi[i-1];}}int main(){int t,n;    scanf("%d",&t);    PHI();     for(int i=1;i<=t;i++){scanf("%d",&n);printf("%d %d %d\n",i,n,phi[n]*2+1);    } return 0 ;}


原创粉丝点击