四平方和-思维-unodered_map

题目描述
四平方和定理,又称为拉格朗日定理:

每个正整数都可以表示为至多 4个正整数的平方和。

如果把 0包括进去,就正好可以表示为 4个数的平方和。

比如:

5=02+02+12+22

7=12+12+12+22

对于一个给定的正整数,可能存在多种平方和的表示法。

要求你对 4个数排序:

0≤a≤b≤c≤d

并对所有的可能表示法按 a,b,c,d

为联合主键升序排列,最后输出第一个表示法。
输入格式
输入一个正整数 N
输出格式
输出4个非负整数,按从小到大排序,中间用空格分开。
数据范围
0 输入样例:
5
输出样例:
0 0 1 2

做法:
1.正常暴力去做是n3的复杂度明显暴力不行,现在要用空间换时间,使用n2的方法去做。
2.利用unordered_map存储先遍历的c和d的信息,在进行a,b的遍历,这样就可以进行2次2个for进行解决,其中unordered_map中的find的复杂度为o(1)

#include <iostream>
#include <cmath>
#include <unordered_map>
using namespace std; 

int n; 
unordered_map <int, int> f;

int main(){
	cin >> n;
	for(int c = 0; c * c <= n / 2; c++){
		for(int d = c; c * c + d * d <= n; d++){
			if(f.find(c * c + d * d) == f.end()){
				f[c*c + d * d] = c;
			}
		}
	}
	for(int a = 0; a * a * 4 <= n; a++){
		for(int b = a; b * b + a * a <= n / 2; b++){
			if(f.find(n - a * a - b * b) != f.end()){
				int c = f[n - a * a - b * b];
				int d = int(sqrt(n - a * a - b * b - c * c) * 1.0);
				cout << a << " " << b << " " << c << " " << d << endl;
				return 0;
			}
		}
	}
	return 0;
}

你可能感兴趣的:(四平方和-思维-unodered_map)