求一个给定的圆(x^2+y^2=r^2),在圆周上有多少个点的坐标是整数。n<=2000 000 000。
显然我们可以算出(x>0,y>0,x<=y)的情况数在*8(其他方向都是对称的)
在勾股数中有这样一个结论:
a^2+b^2=c^2,(a,b,c)=1
则有m,n( (m,n)=1 )满足:
a=m^2-n^2
b=2*m*n
c=m^2+n^2
在这个问题中,c=kr,所以我们先枚举k,再枚举m^2+n^2=c/k且(m,n)=1的组数,最后HASH去重就行了。
CODE:
#include<cstdio>
#include<set>
#include<utility>
#include<cmath>
using namespace std;
set<pair<int,int> > s;
void search(int x,int y){
if(x%4!=1) return;
int sx=sqrt(x/2);
for(int i=1;i<=sx;i++){
int t=sqrt(x-i*i);
if(t*t==x-i*i){
int tx=t*t-i*i,ty=2*t*i;
if(tx>0){
if(tx<ty){
int tmp=tx;tx=ty;ty=tmp;
}
s.insert(make_pair(tx*y,ty*y));
}
}
}
}
int main(){
int r;
scanf("%d",&r);
int sr=sqrt(r);
for(int i=1;i<=sr;i++)
if(!(r%i)){
search(i,r/i);
if(i*i!=r) search(r/i,i);
}
printf("%d\n",s.size()*8+4);
return 0;
}
浙公网安备 33010602011771号