HAOI2008 圆上的整点

HAOI2008 圆上的整点

这里先只考虑x,y都大于0的情况

如果x^2+y^2=r^2,则(r-x)(r+x)=y*y

令d=gcd(r-x,r+x),r-x=d*u^2,r+x=d*v^2,显然有gcd(u,v)=1且u<v

有2r=d*(u^2+v^2),y=d*u*v,x=d(v^2-u^2)/2

枚举2r的约数d,再花费sqrt(2r/d)的时间枚举u,求出v=sqrt(2r/d-u^2)然后判断gcd(u,v)=1

最后结果乘以4(四个象限)+4(坐标轴上)即可

#include  < iostream >
#include 
< cstdlib >
#include 
< cstdio >
#include 
< cmath >

using   namespace  std;

int  res;

int  gcd( int  a, int  b) // ·ÇµÝ¹éʵÏÖ
{
  
while (b) {  int  t = a % b; a = b; b = t; }
  
return  a;
}

void  solve( long   long  rr)
{
  
long   long  t;
  
int  i,j;
  
for (i = 1 ;(t = ( long   long )(i) * i) <= rr;i ++ )
  {
    j
= int (sqrt(rr - t) + 0.5 );
    
if  (i >= j)  break ;
    
if  (t + ( long   long )(j) * j == rr && gcd(i,j) == 1 )
      res
++ ;
  }
}

int  main( void )
{
  
int  u,v,m,r,t;
  
long   long  rr,d;
  scanf(
" %d " , & r);
  rr
= r;
  rr
<<= 1 ;
  res
= 1 ;
  
for (d = 1 ;( long   long )(d) * d <= rr;d ++ )
  {
    
if  (rr % d != 0 continue ;
    solve(rr
/ d);
    
if  (( long   long )(d) * d == rr)  break ;
    solve((
long   long )(d));
  }
  printf(
" %d\n " ,res << 2 );
  
return   0 ;
}

你可能感兴趣的:(HAOI2008 圆上的整点)