题意:给个N*N的矩形点,求在原点看去能看到多少个点
思路:除了(1,0),(0,1),(1,1)外其他点的xy都互质。所以求欧拉函数。fhi[i]从2加到n,再是两倍,再加3。
#include<cstdio> #include<cstring> #include<algorithm> #include<vector> #include<map> #include<queue> #include<cmath> using namespace std; const int max_n=100010; int v[max_n],prime[max_n],phi[max_n]; void euler(int n) { memset(v,0,sizeof(v)); int m=0; for(int i=2;i<=n;i++) { if(v[i]==0) { v[i]=i; prime[++m]=i; phi[i]=i-1; } for(int j=1;j<=m;j++) { if(prime[j]>v[i]||prime[j]>n/i) break; v[i*prime[j]]=prime[j]; phi[i*prime[j]]=phi[i]*(i%prime[j]?prime[j]-1:prime[j]); } } } int main() { int n; euler(100000); int t; scanf("%d",&t); int x=0; while(t--){ scanf("%d",&n); long long sum=0; for(int i=2;i<=n;i++) sum+=phi[i]; sum=sum*2+3; printf("%d ",++x); printf("%d ",n); printf("%lld ",n==0?0ll:sum); } }