GitHubSeob

C++ / 백준 / 15711 / 환상의 짝꿍 본문

Baekjoon/Gold

C++ / 백준 / 15711 / 환상의 짝꿍

GitHubSeob 2023. 6. 8.

문제

https://www.acmicpc.net/problem/15711

 

15711번: 환상의 짝꿍

환상의 나라 디디랜드에서는 인연의 증표로 끈을 하나씩 가지고 있다. 그들은 지극히 평범한 방법으로 이 끈을 이용하여 어떤 두 사람이 환상의 짝꿍인지 판단하는데, 두 사람의 끈을 서로 이

www.acmicpc.net

문제풀이

A+B의 최댓값은 4*10^12 이므로 구할 소수의 최댓값을 2*10^6으로 두고 했다.

A+B=2, 3일 때는 소수의 합으로 나타낼 수 없으므로 NO를 출력한다.

적당한 범위 내에선 골드바흐의 추측이 맞으므로 A+B의 값이 짝수일 경우는 YES를 출력하면 된다.

 

값이 홀수가 나오려면 홀수+짝수의 경우의 수밖에 없다.

그리고 소수 중에 짝수인 수는 2밖에 없으므로 A+B-2의 값이 소수인지만 판별하면 된다.

2,000,000까지의 수 중에서 소수를 에라토스테네스의 체를 이용하여 미리 구한다.

A+B의 값에서 2를 뺀 후 미리 구한 모든 소수를 이용하여 나눠본 후 나머지가 0인지, 0이 아닌지만 판별하면 된다.

 

 

코드

#include <iostream>
#include <vector>
#include <cmath>
using  namespace std;
#define MAX_N 2000000

vector<bool>isPrime(MAX_N + 1, true);
vector<long long>prime;

int main() {
	ios::sync_with_stdio(false);
	cin.tie(NULL);

	long long T(0), A(0), B(0), C(0), idx(0), idx2(0);
	cin >> T;

	for (idx = 2; idx < sqrt(MAX_N); ++idx) {
		for (idx2 = 2; idx2 * idx < MAX_N; ++idx2) {
			isPrime[idx * idx2] = false;
		}
	}
	for (idx = 2; idx < isPrime.size(); ++idx) {
		if (isPrime[idx] == true)
			prime.push_back(idx);
	}

	while (T--) {
		cin >> A >> B;
		C = A + B;
		if (C <= 3) cout << "NO\n";
		else if (C % 2 == 0) cout << "YES\n";
		else {
			bool answer(true);
			C -= 2;
			for (idx = 0; prime[idx] <= sqrt(C); ++idx) {
				if (C % prime[idx] == 0) {
					answer = false;
					break;
				}
			}
			if (answer == true)
				cout << "YES\n";
			else
				cout << "NO\n";
		}
	}
}

'Baekjoon > Gold' 카테고리의 다른 글

C++ / 백준 / 9466 / 텀 프로젝트  (0) 2023.06.14
C++ / 백준 / 1826 / 연료 채우기  (0) 2023.06.14
C++ / 백준 / 1016 / 제곱 ㄴㄴ 수  (0) 2023.06.07
C++ / 백준 / 9663 / N-Queen  (1) 2023.06.06
C++ / 백준 / 5430 / AC  (0) 2022.04.21