链接
http://www.lydsy.com/JudgeOnline/problem.php?id=1041
题解
1A二连击。虽然是抄的题解
显然
y2=(R−x)(R+x)
令 d=gcd(R−x,R+x),A=R−xd,B=R+xd
则 A<B
代入原式
y2d2=AB
显然 y2b2=(ab)2 是完全平方数
因此 AB 也是完全平方数
又因 gcd(A,B)=1 ,所以 A 、
令 A=a2,B=b2
则
a2=R−xd,b2=R+xd
a2+b2=2Rd
由前面易知 a<b ,所以 a2<Rd
因此枚举 d|2R ,这个可以根号。
对于一个 d|2R 的 d ,对应两个式子
其中分别有 a2<Rd 和 a2<d2
枚举 a2 ,算出对应的 b ,如果
在 will7101 大佬的帮助下,用积分求出时间复杂度 O(n34)
代码
//数学
#include <cstdio>
#include <algorithm>
#include <cmath>
#define ll long long
using namespace std;
ll R;
ll gcd(ll a, ll b){return !b?a:gcd(b,a%b);}
bool check(ll x)
{
ll t=sqrt(x);
return t*t==x;
}
int main()
{
ll d, a, b, ans=0;
scanf("%lld",&R);
for(d=1;d*d<=2*R;d++)
{
if(2*R%d==0)
{
for(a=1;a*a<d/2;a++)
{
b=sqrt(d-a*a);
if(a*a+b*b==d and gcd(a,b)==1)ans++;
}
for(a=1;a*a<R/d;a++)
{
b=sqrt(2*R/d-a*a);
if(a*a+b*b==2*R/d and gcd(a,b)==1)ans++;
}
}
}
printf("%lld\n",ans*4+4);
return 0;
}