BZOJ1041: [HAOI2008]圆上的整点

来源:互联网 发布:网络监控测试仪 编辑:程序博客网 时间:2024/05/16 03:44

Description

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

Input

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

Output

整点个数

Sample Input

4
Sample Output

4

题目传送门

这题目质量很高,%%一发出题人
从hzw学长那里抠了一张图片下来:
这里写图片描述
这里写图片描述
然后枚举每一个d和a(设它为最小值就可以了)
说实话考试的时候考这道题99.99%我不会做

代码如下(其实和hzw一模一样我都不好意思贴了):

#include<cmath>#include<cstdio>#include<cstring>#include<cstdlib>#include<algorithm>using namespace std;typedef long long ll;ll R;ll ans=0;ll gcd(ll a,ll b){if(a==0)return b;else return gcd(b%a,a);}bool check(ll y,double x){    if(x==floor(x))    {        ll tx=floor(x);        if(gcd(tx*tx,y*y)==1&&tx!=1)            return 1;    }    return false;}int main(){    scanf("%lld",&R);    for(ll d=1;d<=sqrt(2*R);d++)    {        if(2*R%d==0)        {            for(ll a=1;a<=(ll)sqrt((2*R)/(2*d));a++)            {                double b=sqrt(2*R/d-a*a);                if(check(a,b)==true)                    ans++;            }            if(d!=(2*R)/d)            {                for(ll a=1;a<=(ll)sqrt(d/2);a++)                {                    double b=sqrt(d-a*a);                    if(check(a,b)==true)                        ans++;                }            }        }    }    printf("%lld\n",ans*4+4);    return 0;}

by_lmy