BZOJ 1041: [HAOI2008]圆上的整点

1041: [HAOI2008]圆上的整点

Time Limit: 10 Sec  Memory Limit: 162 MB
Submit: 2951  Solved: 1296
[Submit][Status][Discuss]

Description

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

Input

r

Output

整点个数

Sample Input

4

Sample Output

4

HINT

 

n<=2000 000 000

 

#include<stdio.h>
#include<cmath>
#include<string.h>
#define LL long long
LL r;
LL ans;
LL gcd(LL x,LL y)
{
	return x%y==0?y:gcd(y,x%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 true;
		}
	}
	return false;
}
int main()
{
	scanf("%lld",&r);
	for(LL d=1;d<=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(check(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(check(a,b))
					ans++;
				}
			}
		}
	}
	printf("%lld\n",ans*4+4);
	return 0;
} 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值