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

来源:互联网 发布:自制电子相册软件 编辑:程序博客网 时间:2024/05/09 16:20

如果某整数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

0 0