https://www.lydsy.com/JudgeOnline/problem.php?id=1041
这道题是我和大奶牛学长一起完成的
我推出了公式,而且我发现我的这种做法要比网上其他的解题方法要来的简单
但是推出了公式我不会解
然后问了大奶牛学长
果然他想出了办法
我的解题思路是这样的
设k=r-y
其中k大于0小于r
那么原式变成了
x^2=(2*r-k)*k
那么问题变成了满足这样条件的k有多少个
好了
直接先打表然后找除数再求就好了
AC代码:
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const ll N=4e9+10;
vector<ll> V;
bool check(ll x){
ll y=sqrt(x);
return y*y==x;
}
ll gcd(ll a,ll b){
return a%b==0?b:gcd(b,a%b);
}
ll get(ll x,ll y){
ll ans=0;
for(ll i=0;i<V.size()&&V[i]*2<x;++i){
if(check(x-V[i])&&gcd(x-V[i],V[i])==1){
++ans;
}
}
return ans;
}
int main(){
for(ll i=1;i*i<=N;++i)
V.push_back(i*i);
ll x;
scanf("%lld",&x);
ll y=2*x;
ll ans=0;
for(ll i=1;i*i<=y;++i){
if(y%i==0){
ans+=get(i,y/i);
if(i*i!=y)
ans+=get(y/i,i);
}
}
printf("%lld\n",ans*4+4);
}