[BZOJ1041] [HAOI2008] 圆上的整点 (数学)
Description
求一个给定的圆(x^2+y^2=r^2),在圆周上有多少个点的坐标是整数。
Input
只有一个正整数n,n<=2000 000 000
Output
整点个数
Sample Input
4
Sample Output
4
HINT
Source
Solution
1 #include <bits/stdc++.h> 2 using namespace std; 3 typedef long long ll; 4 5 ll gcd(ll a, ll b) 6 { 7 return b ? gcd(b, a % b) : a; 8 } 9 10 int main() 11 { 12 ll r, d, a, ans = 1; 13 double b; 14 cin >> r; 15 for(d = (ll)(sqrt(2.0 * r) + 0.5); d; --d) 16 { 17 if(2 * r % d) continue; 18 for(a = (ll)(sqrt(1.0 * r / d) + 1e-6); a; --a) 19 { 20 b = sqrt(2.0 * r / d - a * a); 21 if(b - (ll)b > 1e-6) continue; 22 if(a != (ll)b && gcd(a, (ll)b) == 1) ++ans; 23 } 24 if(d == 2 * r / d) continue; 25 for(a = (ll)(sqrt(0.5 * d) + 1e-6); a; --a) 26 { 27 b = sqrt(d - a * a); 28 if(b - (ll)b > 1e-6) continue; 29 if(a != (ll)b && gcd(a, (ll)b) == 1) ++ans; 30 } 31 } 32 cout << ans * 4 << endl; 33 return 0; 34 }