PS

BOJ 15711 : 환상의 짝꿍

lickelon 2024. 8. 14. 22:56
  • 문제 링크 : boj.kr/15711
  • 난이도 : G3
  • 태그 : 정수론, 소수 판정

코드

#include <bits/stdc++.h>

#define all(x) (x).begin(), (x).end()

#define INF 0x7FFFFFFF

using namespace std;

using ll = long long;
using ld = long double;
using pii = pair<int,int>;
using pll = pair<ll, ll>;

vector<ll> sieve(int n) {
    vector<ll> primes;
    vector<bool> check(n+1, true);
    for(int i = 2; i <= n; i++) {
        if(check[i]) {
            primes.emplace_back(i);
            for(int j = i+i; j <= n; j += i) {
                check[j] = false;
            }
        }
    }
    return primes;
}

int main()
{
    ios::sync_with_stdio(0);
    cin.tie(0); cout.tie(0);

    int T;
    cin >> T;
    vector<ll> primes = sieve(2e6);
    while(T--) {
        ll a, b;
        cin >> a >> b;
        a += b;
        if(a < 4) {
            cout << "NO\n";
            continue;
        }
        if(a % 2) {
            bool check = true;
            a -= 2;
            for(auto u : primes) {
                if(a != u && a % u == 0) {
                    check = false;
                    break;
                }
            }
            cout << (check ? "YES" : "NO") << "\n";
        }
        else {
            cout << "YES" << "\n";
        }
    }
    return 0;
}

풀이

a+b의 합을 두 소수의 합으로 나타낼 수 있는지 확인한다.

두 소수의 합과 관련된 유명한 추측이 있다. 2보다 큰 짝수는 두 소수의 합으로 나타낼 수 있다는 골드바흐의 추측은 400경 이하의 짝수에서 성립함이 확인되었으므로 a+b가 짝수라면 두 소수의 합으로 나타낼 수 있다.

a+b가 홀수라면 가능한 경우는 2 + x꼴이므로 x가 소수인지 확인하면 된다. x가 4*10^12보다 작으므로 2*10^6까지의 소수로 나눠보면 된다.

'PS' 카테고리의 다른 글

BOJ 12757 : 전설의 JBNU  (0) 2024.08.16
BOJ 5972 : 택배 배송  (0) 2024.08.15
BOJ 17841 : UNIST는 무엇의 약자일까?  (0) 2024.08.13
BOJ 5831 : Blink  (0) 2024.08.12
BOJ 7453 : 합이 0인 네 정수  (0) 2024.08.11