4 제곱 합 - 사유 - unoderedmap

제목 은 4 제곱 과 정 리 를 묘사 하고 라 그 랑 일 정리 라 고도 부른다.
모든 정 수 는 최대 4 개의 정수 의 제곱 합 을 나 타 낼 수 있다.
0 을 포함 하면 4 개의 제곱 합 을 나 타 낼 수 있다.
예 를 들 면:
5=02+02+12+22
7=12+12+12+22
주어진 정수 에 대해 서 는 여러 가지 제곱 과 표현법 이 존재 할 수 있다.
네 개의 수 를 정렬 하 라 고 요구 합 니 다:
0≤a≤b≤c≤d
그리고 모든 가능 한 표현법 에 대해 a, b, c, d
연합 메 인 키 의 오름차 순 을 배열 하기 위해 마지막 으로 첫 번 째 표현 법 을 출력 합 니 다.입력 형식 은 정수 N 출력 형식 을 입력 하여 4 개의 비 마이너스 정 수 를 출력 하고 작은 것 부터 큰 것 까지 정렬 하 며 중간 에 빈 칸 으로 나 눕 니 다.데이터 범위 0 입력 샘플: 5 출력 샘플: 0 01 2
방법: 1. 정상 적 인 폭력 으로 하 는 것 은 n3 의 복잡 도가 뚜렷 하고 폭력 이 안 됩 니 다. 지금 은 공간 으로 시간 을 바 꾸 고 n2 의 방법 으로 해 야 합 니 다.2. unordered 이용map 는 먼저 옮 겨 다 니 는 c 와 d 의 정 보 를 저장 하고 a, b 의 옮 겨 다 니 며 2 회 for 로 해결 할 수 있 습 니 다. 그 중에서 unorderedmap 의 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;
}

좋은 웹페이지 즐겨찾기