题意:求一个给定的圆(x^2+y^2=r^2),在圆周上有多少个点的坐标是整数。
这居然不是几何题(╯‵□′)╯︵┻━┻
这居然是道数轮题(╯-_-)╯╧╧
我们只考虑x>0 且 y>0 即在第一象限的情况,然后最终=第一象限答案*4 + 4(坐标轴上的四个点)
x^2+y^2=r^2
即 y^2 = r^2-x^2 = (r+x)(r-x)
令d=gcd(r+x,r-x)
所以 r+x=d*U ,r-x=d*V 且 gcd(U,V)=1
所以 y^2 = d^2 +U*V
因为y^2 和 d^2 都是完全平方数
又因为x>0 即 U<>V
所以U和V也都是完全平方数
令U=u*u,V=v*v (u>v>0 且 gcd(u,v)=1)
则有 2*r=(r+x) + (r-x) = d*(u*u+v*v) ; x=[(r+x)-(r-x)] / 2 = d(u*u-v*v)/2 ; y = d*u*v
所以我们枚举2*r的因数d,再枚举u,并计算出 v=sqrt(2*r/d - u*u) ,然后判断u和v是否满足条件 (用U和V判断也可以)
即 u>v>0 且 gcd(u,v)=1 且 u*u+v*v=2*r/d (U和V必须是完全平方数)
var r,ans,d,u,v :int64; i :longint; function gcd(a,b:int64):int64; begin if b=0 then exit(a) else exit(gcd(b,a mod b)); end; procedure work(t:int64); var j:longint; begin for j:=1 to trunc(sqrt(t)) do begin u:=int64(j); v:=trunc(sqrt(t-u*u)); if u>v then begin if (gcd(u,v)=1) and (u*u+v*v=t) and (v<>0) then inc(ans); end; end; end; begin read(r); r:=r<<1; ans:=1; for i:=1 to trunc(sqrt(r)) do begin d:=int64(i); if (r mod d=0) then begin work(r div d); if d*d<>r then work(d); end; end; ans:=ans<<2; writeln(ans); end. ——by Eirlys
