POJ 3090
所谓可见点,即是(a,b)=1的点,使用欧拉函数,求出比之小的与之互质的个数即可,又对称,所以乘2,最后要+1.
#include <iostream> #include <algorithm> #include <cstdio> #include <cmath> using namespace std; const int N=1050; int phi[N]; void initial(){ for(int i=1;i<N;i++) phi[i]=i; for(int i=2;i<N;i+=2) phi[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); } } } int main(){ initial(); int T,n,kase=0; scanf("%d",&T); while(T--){ scanf("%d",&n); int ans=0; for(int i=2;i<=n;i++) ans+=phi[i]; ans=(ans+1)*2+1; printf("%d %d %d\n",++kase,n,ans); } return 0; }