暴力枚举出x*x + y * y能组合的数,然后从小到大枚举即可
#include <bits/stdc++.h>
#define l first
#define r second
using namespace std;
typedef pair<int, int> PII;
typedef long long ll;
const int N = 1e7;
PII st[N];
bool check(int k)
{
if(!k || st[k].l != 0 || st[k].r != 0) return true;
return false;
}
void init(int n)
{
for(ll i = 0; i * i <= n; i ++ )
for(ll j = i; i * i + j * j <= n; j ++ )
{
int k = i * i + j * j;
if(!check(k)) st[k] = {i, j};
}
}
int main()
{
init(5 * 1e6);
int n;
cin >> n;
for(int i = 0; i * i <= n; i ++ )
for(int j = i; i * i + j * j <= n; j ++ )
{
int t = n - (i * i + j * j);
if(t < 0)break;
if(check(t))
{
printf("%d %d %d %d\n", i, j, st[t].l, st[t].r);
return 0;
}
}
}