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;
}