[HAOI2008]圆上的整点

题目描述

求一个给定的圆(x^2+y^2=r^2),在圆周上有多少个点的坐标是整数。

输入输出格式

输入格式:

r

输出格式:

整点个数

输入输出样例

输入样例#1:
4
输出样例#1:
4

说明

n<=2000 000 000

接下来枚举d,a

为什么要除d?

因为他们不互质,a*b是完全平方数≠a,b都是完全平方数

记住还要a*a,b*b互质

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<cstring>
 4 #include<algorithm>
 5 #include<cmath>
 6 using namespace std;
 7 long long r,k,ans,p,q;
 8 int tot;
 9 long long ys[500001];
10 void Dvide(long long x)
11 {int i;
12   for (i=1;i<=sqrt(x);i++)
13     if (x%i==0)
14       {
15     if (i*i==x)
16       {
17         tot++;
18         ys[tot]=i;
19       }
20     else
21       {
22         tot++;
23         ys[tot]=i;
24         tot++;
25         ys[tot]=x/i;
26       }
27       }
28 }
29 long long GCD(long long a,long long b)
30 {
31   if (b==0)
32     return a;
33   return GCD(b,a%b);
34 }
35 int main()
36 {int i;
37   cin>>r;
38   Dvide(2*r);
39   for (i=1;i<=tot;i++)
40     {
41       for (p=1;p*p<(r/ys[i]);p++)
42     {
43       q=sqrt(2*r/ys[i]-p*p);
44       if (p*p+q*q==2*r/ys[i])
45         if (GCD(p*p,q*q)==1) ans++;
46     }
47     }
48   cout<<ans*4+4;
49 }

 

 

posted @ 2017-09-19 21:19  Z-Y-Y-S  阅读(267)  评论(0编辑  收藏  举报