题意为如果站在0,0这个点,在n*n的网格内可以看到多少整点。
首先我们进行问题转换,我们发现如果一个点(p,q)能被看到那么它后面整数K倍的(k*p,k*q)的点一定是看不到
的。即p与q必须是互质的我们才能看到它。
那么对于0~n每一个p,我们要求的是0~n与p互质的数个数,但是现有的欧拉函数只能求p以内的互质的个数,所以
通过对称,再加上1种p与q相等的情况,即为答案。
下附AC代码。
#include<iostream>
#include<vector>
#include<stdio.h>
#define maxn 1005
using namespace std;
vector<int> prime;
int sum[maxn];
int phi[maxn];
void init()
{
phi[1]=1;
for(int i=2;i<maxn;i++)
{
if(phi[i]==0)
{
phi[i]=i-1;
prime.push_back(i);
}
for(int j=0;j<prime.size()&&prime[j]*i<maxn;j++)
{
if(i%prime[j]==0)
{
phi[i*prime[j]]=phi[i]*prime[j];
break;
}
else
{
phi[i*prime[j]]=phi[i]*(prime[j]-1);
}
}
}
}
int main()
{
init();
for(int i=1;i<maxn;i++)
sum[i]=sum[i-1]+phi[i];
int now;
int t;
cin>>t;
int kase=0;
while(~scanf("%d",&now))
printf("%d %d %d\n" ,++kase,now,sum[now]*2+1);
}