如果某整数
x
代入圆方程得到的
坐标轴上必有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
求一个给定的圆(
Input
r
Output
整点个数
Sample Input
4
Sample Output
4