1041: [HAOI2008]圆上的整点
Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 4499 Solved: 2023
[ Submit][ Status][ Discuss]
Description
求一个给定的圆(x^2+y^2=r^2),在圆周上有多少个点的坐标是整数。
Input
只有一个正整数n,n<=2000 000 000
Output
整点个数
Sample Input
4
Sample Output
4
HINT
以下转自:http://hzwer.com/1457.html
#include<cstdio>
#include<cmath>
using namespace std;
typedef long long ll;
ll r,ans,d,a;
ll gcd(ll x,ll y){return x%y?gcd(y,x%y):y;}
bool check(ll y ,double x)
{
if(x==floor(x)){
ll x1=(ll)floor(x);
if(gcd(x1*x1,y*y)==1&&x1*x1!=y*y)return 1;
}
return 0;
}
int main()
{
scanf("%lld",&r);
for(d=1;d<=(ll)sqrt(r<<1LL);d++)
if((r<<1LL)%d==0){
for(a=1;a<=(ll)sqrt((r<<1LL)/(d<<1LL));a++)
if(check(a,sqrt(((2*r)/d)-a*a)))ans++;
if(d!=(r<<1LL)/d)
for(a=1;a<=(ll)sqrt(d>>1LL);a++)if(check(a,sqrt(d-a*a)))ans++;
}
printf("%lld",(ans+1)<<2LL);
}

本文介绍了解决HAOI2008竞赛中圆上整点计数问题的一种高效算法。该算法通过枚举特定变量并进行有效判断,避免了暴力求解的大规模计算,最终实现了在合理时间内找到给定半径圆周上的所有整数坐标点。

455

被折叠的 条评论
为什么被折叠?



