题目描述
四平方和定理,又称为拉格朗日定理:
每个正整数都可以表示为至多4个正整数的平方和。
如果把0包括进去,就正好可以表示为4个数的平方和。
比如:
5 = 0^2 + 0^2 + 1^2 + 2^2
7 = 1^2 + 1^2 + 1^2 + 2^2
(^符号表示乘方的意思)
对于一个给定的正整数,可能存在多种平方和的表示法。
要求你对4个数排序:
0 <= a <= b <= c <= d
并对所有的可能表示法按 a,b,c,d 为联合主键升序排列,最后输出第一个表示法
输入
程序输入为一个正整数N (N<5000000)
输出
要求输出4个非负整数,按从小到大排序,中间用空格分开
就是简单的把四重循环,改成三重循环,需要注意的是,数据要大一点,可能会出现2000+
#include<cstdio>
#include<iostream>
#include<cstring>
#include<algorithm>
#include<queue>
#include<stack>
#include<set>
#include<map>
#include<vector>
#include<cmath>
const int maxn=1e5+5;
typedef long long ll;
using namespace std;
int main(){
long long n;
cin>>n;
for(int i=0;i<1005;i++){
for(int j=0;j<2005;j++){
for(int q=0;q<2005;q++){
int tmp=sqrt(n-i*i-j*j-q*q);
if(n==i*i+j*j+q*q+tmp*tmp){
cout<<i<<" "<<j<<" "<<q<<" "<<tmp<<endl;
return 0;
}
}
}
}
}