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