原题
这题没怎么用二分,但是提供了一种新的多元素枚举的方法,学到了学到了
#include<bits/stdc++.h>
using namespace std;
const int N = 5e5 + 10;
int C[N], D[N];
int n;
bool st[N];
int main()
{
cin>>n;
memset(C, -1, sizeof C);
//分两步进行枚举,先枚举c、d,把所有可能出现的c^2和d^2存下
//注意c和d在进行遍历时的范围
for(int c = 0; c * c <= n; c ++ ){
for(int d = 0; d * d + c * c <= n; d ++ ){
int s = c * c + d * d;
if(C[s] == -1){
C[s] = c, D[s] = d;//记录
}
}
}
//枚举a^2和b^2,看有没有和已存下的c^2+d^2适配的
//注意a和b在进行遍历时的范围
for(int a = 0; a * a <= n; a ++ ){
for(int b = 0; a * a + b * b <= n; b ++ ){
int s = n - a * a - b * b;
if(C[s] != -1){
cout<<a<<' '<<b<<' '<<C[s]<<' '<<D[s]<<endl;
return 0;
}
}
}
return 0;
}