1041: [HAOI2008]圆上的整点
Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 2838 Solved: 1238
[ Submit][ Status][ Discuss]
Description
求一个给定的圆(x^2+y^2=r^2),在圆周上有多少个点的坐标是整数。
Input
r
Output
整点个数
Sample Input
4
Sample Output
4
HINT
n<=2000 000 000
Source
X ^ 2 + Y ^ 2 = R ^ 2
移项 Y ^ 2 = R ^ 2 - X ^ 2
= (R + X)(R - X)
设 d = GCD(R + X, R - X)
则 Y ^ 2 = d ^ 2 * (R + X) / d * (R - X) / d
设 A = (R + X) / d, B = (R - X) / d
则 A != B 且 GCD(A, B) = 1
且 Y ^ 2 = d ^ 2 * A * B
由于Y ^ 2 是完全平方数, d ^ 2也是完全平方数, 而A, B互质,所以A, B都是完全平方数
设 A = a ^ 2, B = b ^ 2
则 a ^ 2 + b ^ 2 = 2 * R / d
#include<stdio.h>
#include<math.h>
#include<string.h>
#include<algorithm>
using namespace std;
long long m,n,x,y,k,i,j,ans;
long long gcd (long long x,long long y)
{
long long help=1;
while(help)
{
help=x%y;
x=y;
y=help;
}
return x;
}
void ac(long long x)
{
long long help=sqrt(x/2),m,n,p,i;
for(i=1;i<=help;i++)
{
m=i*i;
n=x-m;
p=sqrt(n);
if(p*p==n&&gcd(m,n)==1&&m!=n)
ans++;
}
}
int main()
{
while(scanf("%lld",&n)!=EOF)
{
k=sqrt(2*n);
ans=0;
for(i=1;i<=k;i++)
{
if(2*n % i ==0)
{
ac(i);
ac(2*n/i);
}
}
printf("%lld\n",(ans+1)*4);
}
}