求一个给定的圆(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; }