bzoj 1041 数论

来源:互联网 发布:python截取指定字符串 编辑:程序博客网 时间:2024/06/06 16:30

题意:求一个给定的圆(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



0 0
原创粉丝点击