[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 }
View Code

 

posted @ 2016-07-13 17:11  CtrlCV  阅读(319)  评论(0编辑  收藏  举报