题目:
![](https://i-blog.csdnimg.cn/blog_migrate/b1f8770187394029ec3e30e7d06d8c91.png)
![](https://i-blog.csdnimg.cn/blog_migrate/e0c3a06b1df759a22c85d1d39dacdf3f.png)
输入样例:
5
输出样例:
0 0 1 2
♥
中心思想:
就是上面那个其实就是存的a²+b²的值时分别对应的cd
那在下面枚举的时候就是直接取ab最小的时候输出就结束了
#include <cstring>
#include <cstdio>
#include <iostream>
#include <algorithm>
using namespace std;
const int N = 5e6+10;
int n;
struct node{
int v,c,d;
}arr[N];
int main(){
cin>>n;
for(int c=0;c*c<=n;c++){
for(int d=c;d*d+c*c<=n;d++){
int t = n-(c*c+d*d);
if(!arr[t].v){
arr[t].v=1;
arr[t].c=c;
arr[t].d=d;
}
}
}
for(int a=0;a*a<=n;a++){
for(int b=0;a*a+b*b<=n;b++){
int t = a*a+b*b;
if(arr[t].v){
printf("%d %d %d %d ",a,b,arr[t].c,arr[t].d);
return 0;
}
}
}
return 0;
}