枚举一下a,b存入表里面,然后枚举c,d,查表看一看存不存在合法的a,b
(暴力枚举) $O(n)$
直接开个pair就可以做到o(1)查询,o(1)存入
时间复杂度
两层循环最大分别为sqrt(n)
复杂度为o(n);
C++ 代码
#include<bits/stdc++.h>
using namespace std;
const int N = 5e6+5;
pair<int,int> t[N];
#define ft first
#define sd second
int main()
{
for(int i = 0;i<=N;i++)t[i].ft=-1,t[i].sd=-1;
int n;cin>>n;
for(int a = 0;a*a<=n;a++)
for(int b = a;a*a+b*b<=n;b++)
{
int s = a*a+b*b;
if(t[s].ft==-1)t[s].ft = a,t[s].sd = b;
}
for(int c = 0;c*c<=n;c++)
for(int d = c;c*c+d*d<=n;d++)
{
int s = n-c*c-d*d;
if(t[s].ft!=-1)
{
cout<<c<<' '<<d<<' '<<t[s].ft<<' '<<t[s].sd;
return 0;
}
}
}