在一个平面直角坐标系的第一象限内,如果一个点(x,y)与原点(0,0)的连线中没有通过其他任何点,则称该点在原点处是可见的。
编写一个程序,计算给0<x,y<=n定整数N的情况下,满足的可见点(x,y)的数量(可见点不包括原点)。
#include<bits/stdc++.h> #define N 10000 #define ll long long using namespace std; int pr[N],phi[N],v[N]; ll sum[N]; void ol(int x) { phi[1]=pr[1]=1; int cut=0; for(int i=2;i<=x;i++) { if(v[i]==0)pr[++cut]=i,phi[i]=i-1; for(int j=1;pr[j]<=x/i&&j<=cut;j++) { v[i*pr[j]]=pr[j]; if(i%pr[j]==0) { phi[i*pr[j]]=pr[j]*phi[i]; break; } phi[i*pr[j]]=phi[i]*(pr[j]-1); } } for(int i=1;i<=1000;i++)sum[i]=sum[i-1]+phi[i]; } int main() { int t; cin>>t; int k=0; ol(1000); while(++k<=t) { int n;cin>>n; printf("%d %d %lld\n",k,n,2*sum[n]+1); } return 0; }