题目链接:http://poj.org/problem?id=3090
和一道叫兔八哥什么的题是差不多的
涉及到网格图上的一个问题:判断(x1,y1)和(x2,y2)的连线上有没有其它格点
当gcd(|x1-x2|,|y1-y2|)=1时,是满足要求的
所以就是结合线性筛,用欧拉函数phi搞一搞就好了
贴代码
#include<cstdio>
#include<cstring>
using namespace std;
int const maxn=1005;
int phi[maxn],prime[maxn];
bool vis[maxn];
int n,Q;
int main(){
// freopen("3090.in","r",stdin);
// freopen("3090.out","w",stdout);
scanf("%d",&Q);
for (int t=1;t<=Q;t++){
scanf("%d",&n);
memset(vis,0,sizeof(vis));
memset(phi,0,sizeof(phi));
int cnt=0,ans=2;
for (int i=2;i<=n;i++){
if (!vis[i])prime[++cnt]=i,phi[i]=i-1;
for (int j=1;j<=cnt&&i*prime[j]<=n;j++){
vis[i*prime[j]]=1;
if (i%prime[j]==0){
phi[i*prime[j]]=phi[i]*prime[j];
break;
}else phi[i*prime[j]]=phi[i]*(prime[j]-1);
}ans=ans+phi[i]*2;
}
printf("%d %d %d\n",t,n,ans+1);
}
return 0;
}
【写的有漏洞的,欢迎路过大神吐槽】
2017/07/08 15:10:29
Ending.