<题目链接>
题目大意:
给出范围为(0, 0)到(n, n)的整点,你站在(0,0)处,问能够看见几个点。
解题分析:
很明显,因为 N (1 ≤ N ≤ 1000) ,所以无论 N 为多大,(0,1),(1,1),(1,0)这三个点一定能够看到,除这三个点以外,我们根据图像分析可得,设一个点的坐标为(x,y) ,那么只有符合gcd(x,y)=1的点才能被看到。又因为 (0,0)---(n,n)对角线两端的点对称,所以我们只需算一边即可,而一边的点数根据欧拉函数可得: $sum_{i=2}^{n}varphi{(i)}$
所以最终的点数为:$$2*sum_{i=2}^{n}varphi{(i)}+3$$
#include <cstdio> #define N int(1e3+10) typedef long long ll; int euler[N]; void init(){ euler[1]=1; for(int i=2;i<N;i++)euler[i]=i; for(int i=2;i<N;i++) if(euler[i]==i) for(int j=i;j<N;j+=i) euler[j]=euler[j]/i*(i-1); } int main(){ init(); int T,ncase=0;scanf("%d",&T); while(T--){ int n;scanf("%d",&n); ll ans=0; for(int i=2;i<=n;i++)ans+=euler[i]; printf("%d %d %d ",++ncase,n,2*ans+3); } }