bzoj1041: [HAOI2008]圆上的整点

http://www.lydsy.com/JudgeOnline/problem.php?id=1041

 

设 X>0 ,Y>0

X^2 + Y^2 = R^2

X^2 = R^2-Y^2 = (R+Y)(R-Y)

令  d=gcd(R+Y,R-Y),A=(R+Y)/d,B=(R-Y)/d

则 gcd(A,B)=1,且A != B                                                                                                                                                                              

 X^2= d^2 *A * B

所以 A * B 为 完全平方数

又因为 gcd(A,B)=1 ,A!=B,所以 A,B 都是 完全平方数

令 a= 根号A,b=根号B

a^2 + b ^2 = 2*R / d

所以 d 必须是 2*R 的 约数   

根号(2*R) 枚举 约数 d

1、a^2 + b^2 = 2*R / d

2、a^2 + b^2 = d

对于 每一种 情况 分别 根号复杂度 枚举 a,计算b

判断相应的 A ,B 是否满足  gcd=1 且 A!=B

满足则 ans+1

这只算出了第一象限的情况

根据园的对称性,ans*4 可得 所有 象限内的点

最后在加上4个在 坐标轴上的点即可

 

 

#include<cmath>
#include<cstdio>

using namespace std;

typedef long long LL;

LL R;

int ans=0;

int gcd(int A,int B) { return !B ? A : gcd(B,A%B); }

void solve(int t,int d)
{
    int n=sqrt(t*1.0);
    int A,B,b;
    for(LL a=1;a<=n;++a)
    {
        B=t-a*a; b=sqrt(B);
        if(b*b!=B || !B) continue;
        A=a*a; 
        if(gcd(A,B)==1 && A!=B) ans++;
    }
}

int main()
{
    scanf("%lld",&R);
    int n=sqrt(R*2.0);
    for(int d=1;d<=n;++d)
    {
        if(R*2%d==0) 
        {
            solve(2*R/d,d);
            if(d*d!=n) solve(d,2*R/d);
        }
    }
    ans/=2;
    ans=ans*4+4;
    printf("%d",ans);
}

 

 

 

 

1041: [HAOI2008]圆上的整点

Time Limit: 10 Sec  Memory Limit: 162 MB
Submit: 4640  Solved: 2092
[Submit][Status][Discuss]

 

Description

 

求一个给定的圆(x^2+y^2=r^2),在圆周上有多少个点的坐标是整数。

 

Input

 

只有一个正整数n,n<=2000 000 000

 

Output

 

整点个数

 

Sample Input

 

4

 

Sample Output

 

4

 

posted @ 2017-11-30 20:44  TRTTG  阅读(84)  评论(0编辑  收藏