标签:数论
Description
求一个给定的圆(x^2+y^2=r^2),在圆周上有多少个点的坐标是整数。
Input
r
Output
整点个数
Sample Input
4
Sample Output
4
HINT
n<=2000 000 000
Source
不要看见圆就以为是几何QwQ
这题其实TMD是数论啊(╯‵□′)╯︵┻━┻
推公式
可以发现
那么
设后面那两个分式分别为A,B
那么一定有
观察
于是我们令
因此从
那么只有
注意出现答案时必须满足
我们知道,d是2r的约数有两种情况
①d 此时枚举a从1到
②
注意每次得到答案要进行检验使得A,B满足条件
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
#define LL long long
using namespace std;
LL r,ans;
LL gcd(LL a,LL b)
{
return !b?a:gcd(b,a%b);
}
bool pd(LL a,double b)
{
if (floor(b)==b)
{
LL tmpb=(LL)(floor(b));
if (gcd(tmpb*tmpb,a*a)==1&&tmpb*tmpb!=a*a) return 1;
}
return 0;
}
int main()
{
scanf("%lld",&r);
for (LL d=1;d<=(LL)(sqrt(2*r));d++)
{
if (2*r%d==0)
{
for (LL a=1;a<=(LL)(sqrt((2*r)/(2*d)));a++)
{
double b=sqrt(2*r/d-a*a);
if (pd(a,b)) ans++;
}
if (d!=2*r/d)
{
for (LL a=1;a<=(LL)(sqrt(d/2));a++)
{
double b=sqrt(d-a*a);
if (pd(a,b)) ans++;
}
}
}
}
printf("%lld",ans*4+4);
}
版权声明:本文为博主原创文章,未经博主允许不得转载。
标签:数论
原文地址:http://blog.csdn.net/creationaugust/article/details/48052329