思路
说实话有点小难这道题,思路的话就是使用一个三元组去存s= (a * a) + (b * b),a,b,定义一个排序结构,使得三元组依次按照s,a,b从小到大排序,然后再用一个两重for循环,二分查找f[l].s==n- (i * i) - (j * j)的第一个三元组,然后输出i,j,a,b
代码
#include <iostream>
#include <cstring>
#include <algorithm>
#include <vector>
#include <cmath>
using namespace std;
struct t{
int s,a,b;
}f[5000010];
bool cmp(t a1,t a2)
{
if(a1.s!=a2.s)return a1.s<a2.s;
if(a1.a!=a2.a)return a1.a<a2.a;
return a1.b<a2.b;
}
int n;
int cnt;
int main()
{
cin>>n;
for(int i=0;i*i<=n;i++)
{
for(int j=i;j*j+i*i<=n;j++)
{
f[cnt++]={j*j+i*i,i,j};
}
}
sort(f,f+cnt,cmp);
for(int i=0;i*i<=n;i++)
{
for(int j=i;i*i+j*j<=n;j++)
{
int temp=n-i*i-j*j;
int l=0,r=cnt-1;
while(l<r)
{
int mid=l+r>>1;
if(f[mid].s<temp)l=mid+1;
else r=mid;
}
if(f[l].s==temp)
{
cout<<i<<' '<<j<<' '<<f[l].a<<' '<<f[l].b;
return 0;
}
}
}
return 0;
}