优化枚举顺序,先枚举c*c,d*d的组合,并记录当c*c+d*d为某数时的c,d取值,然后再枚举a,b,若存在n-a*a-b*b在之前被枚举过,则找到方案
#include<iostream>
using namespace std;
const int N=5000005;
int n;
int c[N];
int d[N];
bool vis[N];
int main()
{
cin>>n;
for(int i=0;i*i<=n;i++)
for(int j=0;j*j<=n;j++)
if(i*i+j*j<=n&&!vis[i*i+j*j])
{
c[i*i+j*j]=i;
d[i*i+j*j]=j;
vis[i*i+j*j]=true;
}
for(int i=0;i*i<=n;i++)
for(int j=0;j*j<=n;j++)
if(i*i+j*j<=n&&vis[n-(i*i+j*j)])
{
cout<<i<<" "<<j<<" "<<c[n-(i*i+j*j)]<<" "<<d[n-(i*i+j*j)];
return 0;
}
}