[P2508 HAOI2008] 圆上的整点 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)
分析:
$y2=r2-x^2=(r-x)(r+x) $
设
则原式变为:
则可以列出两个等式:
枚举2r的约数d并枚举u可以在解决该问题,显然时间复杂度不能接受
注意到u,v互质并且等式左边为平方数则u,v为平方数:
不妨设
则等式变为:
此时枚举2r的约束d并枚举s可以在求解
r数的约数可以粗略估计为最大不会超过r,所以最大时间复杂度为 约为
(实际远比这个小)
int ans,R;
void get(int d,int r){
// cout<<d<<" "<<r<<"\n";
for(int i=1;i<=r/i;i++){
int s=i,t=sqrt(r-i*i);
if(s*s+t*t!=r||__gcd(s,t)!=1)continue;
int x=(t*t-s*s)/2*d,y=d*s*t;
// cout<<x<<" "<<y<<"\n";
if(x>0&&y>0&&x*x+y*y==(R/2)*(R/2))ans+=2;
}
}
void solve(){
int r;cin>>r;
r<<=1;
R=r;
for(int i=1;i<=r/i;i++){
if(r%i==0)get(i,r/i);
if(r%i==0&&i*i!=r)get(r/i,r/(r/i));
}
cout<<(ans+1)*4<<"\n";
}