您的位置:首页 > 其它

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

2016-03-27 11:28 344 查看
如果某整数x代入圆方程得到的y是整数就计入。

坐标轴上必有4个点,而且四象限对称,所以规定x,y≥1

∵x2+y2=r2

∴y2=r2−x2

∴y2=(r−x)(r+x)

∴y=(r−x)(r+x)−−−−−−−−−−−√

令d=gcd(r−x,r+x),A=r−xd,B=r+xd

∴gcd(A,B)=1

∴y=dAB−−−√

∴AB为完全平方数

∵A≠B

∴A,B是完全平方数

令a=A−−√,b=B−−√,a<b

∴a2=r−xd,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

n≤2×109
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: