思路:利用空间换取时间的思想,首先用结构体存储两个数以及这两个数的平方和,其次两层for循环并且利用二分的思想搜索结构体是否存在这样的数字t t=n-ii-jj
#include<iostream>
#include<cmath>
#include<algorithm>
using namespace std;
const int N=5300000;
int m;
struct Sum
{
int s,c,d;
bool operator< (const Sum &t)const
{
if(s!=t.s)return s<t.s;
if(c!=t.c)return c<t.c;
return d<t.d;
}
}sum[N];
int main()
{
int n;
cin>>n;
for(int i=0;i*i<=n;i++)
{
for(int j=i;j*j<=n;j++)
{
sum[m].s=i*i+j*j;
sum[m].c=i;
sum[m].d=j;
m++;
}
}
sort(sum,sum+m);
for(int i=0;i*i<=n;i++)
{
for(int j=i;j*j<=n;j++)
{
int t=n-i*i-j*j;
int left=0,right=m-1;
while(left<right)
{
int mid=(left+right)/2;
if(sum[mid].s<t)
{
left=mid+1;
}
else
{
right=mid;
}
}
if(sum[left].s==t)
{
cout<<i<<" "<<j<<" "<<sum[left].c<<" "<<sum[left].d;
return 0;
}
}
}
}