给定r, 求圆x^2 + y^2 = r^2
上整点的数目. (r是正整数, r≤2e9) 之前看 <什么是数学> 学到一个生成勾股数的公式, 然而我对它的理解并不透彻. 头脑中有这样一组公式:
但是它的行为非常奇怪. 当
翻了翻书, 原来还有这样的说明:
看了题解, 还真承受得了. 有关时间复杂度的讨论见: [bzoj 2705] [SDOI2012] Longge的问题
把2除到左边去就能生成所有毕达哥拉斯三元数了......给个推导:
由于
其中
由上述推导可知, 以上公式生成了所有毕达哥拉斯三元数, 那么会不会重复呢?
把
易知
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
ll gcd(ll a, ll b)
{
return b ? gcd(b, a%b) : a;
}
ll solve(ll r)
{
ll ans = 0;
for (ll i = 1; i*i < r/2; ++i) {
ll j = floor(sqrt(r-i*i) + 0.5);
ans += i*i + j*j == r && gcd(i, j) == 1;
}
return ans;
}
int main()
{
ll n, ans = 0;
scanf("%lld", &n);
for (ll i = 1; i*i <= 2*n; ++i)
if (2*n % i == 0)
ans += solve(i) + (i*i == 2*n ? 0 : solve(2*n/i));
printf("%lld\n", (ans+1)*4);
return 0;
}