P2508-[HAOI2008]圆上的整点【数学】

正题

题目链接:https://www.luogu.com.cn/problem/P2508


题目大意

一个在\((0,0)\)的圆心,半径为\(r\),求圆有多少个整点。

\(1\leq r\leq 2\times 10^9\)


解题思路

设这个点为\((x,y)\),那么有\(x^2+y^2=r^2\)

\[x^2=r^2-y^2=(r+y)(r-y) \]

\(r+y=a\times d,r-y=b\times d,\gcd(a,b)=1\),因为\(x^2\)为完全平方数,所以\(a=u^2,b=v^2\)

\[x^2=u^2v^2d^2\Rightarrow x=u\times v\times d \]

\[2r=(v^2+u^2)\times d \]

所以我们枚举\(2r\)的因数\(d\),然后再枚举一个\(v^2\)就行了。


code

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
#define ll long long
using namespace std;
ll n,m,r,ans;
void solve(ll d){
	for(ll s=1;s*s<=r/d;s++){
		ll t=sqrt(r/d-s*s);
		if(s*s+t*t!=r/d)continue;
		if(__gcd(s,t)>1)continue;
		ll x=(s*s-t*t)/2ll*d;
		ll y=t*s*d;
		if(x>0&&y>0&&x*x+y*y==r/2ll*r/2ll)ans+=2;
	}
	return;
}
signed main()
{
	scanf("%lld",&r);r=r*2ll;
	for(ll i=1;i*i<=r;i++)
		if(r%i==0){
			solve(i);
			if(i*i!=r)solve(r/i);
		}
	printf("%lld\n",(ans+1)*4ll);
	return 0;
}
posted @ 2022-08-20 10:32  QuantAsk  阅读(33)  评论(0编辑  收藏  举报