[BZOJ1041][HAOI2008]圆上的整点

本文详细介绍了如何解决给定圆周上整点数量的问题,通过数学推导和算法实现,提供了一种高效计算方法。

[HAOI2008]圆上的整点

Description
求一个给定的圆(x^2+y^2=r^2),在圆周上有多少个点的坐标是整数。
Input
r
Output
整点个数
Sample Input
4
Sample Output
4
HINT
n<=2000 000 000

Solution

x2+y2=r2

y2=(rx)(r+x)

d=gcd(rx,r+x)

y2=d2pq

p,q(p,q)=1

所以
d2|y2,p=u2,q=v2,(u,v)=1

所以
rx=du2,r+x=dv2

解得
2r=d(u2+v2)

x=d(v2u2)2,y=duv

枚举d|2r,枚举u<2rd,计算v,判断u,v是否互质

Code

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
template<typename T>inline void read(T &x){
    x=0; T f=1; char ch=getchar();
    while(!isdigit(ch)) {if (ch=='-')f=-1; ch=getchar();}
    while(isdigit(ch)) {x=x*10+ch-'0'; ch=getchar();}
    x*=f;
}

const int MaxN=100000;
ll ans=0,r,d[MaxN],tot;

inline ll sqr(ll x){return x*x;}
int main(){
    read(r); r<<=1;
    for(ll i=1;i*i<=r;i++){
        if(r%i==0) d[++tot]=i,d[++tot]=r/i;
        if(i*i==r) tot--;
    }
    for(ll i=1;i<=tot;i++)
        for(ll u=1;u*u<r/d[i];u++){
            ll v_2=r/d[i]-sqr(u),v=trunc(sqrt(v_2));
            if(sqr(1ll*trunc(sqrt(v_2)))==v_2)
                if(__gcd(v_2,u*u)==1) ans++;
        }
    printf("%lld\n",(ans-1)*2+4);
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值