BZOJ 1041 HAOI 2008 圆上的整点 数学推导

75 篇文章 1 订阅
19 篇文章 0 订阅

如果某整数 x 代入圆方程得到的y是整数就计入。
坐标轴上必有4个点,而且四象限对称,所以规定 x,y1
x2+y2=r2
y2=r2x2
y2=(rx)(r+x)
y=(rx)(r+x)
d=gcd(rx,r+x),A=rxd,B=r+xd
gcd(A,B)=1
y=dAB
AB
AB
A,B
a=A,b=B,a<b
a2=rxd,b2=r+xd
a2+b2=2rd
a,b
d|2r
于是 d[1,2r],a[1,d2]
枚举并验证是否存在 b 即可。

#include <cstdio>
#include <cmath>
#define FOR(i,j,k) for(i=j;i<=k;++i)
typedef long long ll;
ll gcd(ll a, ll b) { return !b ? a : gcd(b, a % b); }
void chk(ll x, ll &ans) {
    ll sx = sqrt(x / 2), a2, b, b2, a;
    FOR(a,1,sx) {
        a2 = a * a; b2 = x - a2; b = sqrt(b2);
        if (b * b == b2 && gcd(a2, b2) == 1 && a2 != b2) ++ans;
    }
}
int main() {
    ll s2r, d, a, b, ans = 0, r;
    scanf("%I64d", &r);
    s2r = sqrt(2 * r);
    FOR(d,1,s2r) if ((2 * r) % d == 0) chk(d, ans), chk(2 * r / d, ans);
    printf("%I64d", ans * 4 + 4); 
    return 0;
}

1041: [HAOI2008]圆上的整点

Description

求一个给定的圆(x2+y2=r2),在圆周上有多少个点的坐标是整数。

Input

r

Output

整点个数

Sample Input

4

Sample Output

4

HINT

n2×109

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值