백준 14905 소수 4개의 합

치즈·2022년 12월 18일

BOJ

목록 보기
29/45

골드바흐의 추측에 따르면, 2보다 큰 모든 짝수는 두 개의 소수의 합으로 나타낼 수 있다.
따라서 주어진 수가 짝수라면, (2, 2)를 소수로 고정해두고, 남은 짝수를 두 개의 소수의 합으로 나타낸다.
반면에 주어진 수가 홀수라면, (2, 3)을 소수로 고정해두고 남는 짝수를 두 개의 소수의 합으로 나타낸다.

#include <iostream>
#include <vector>
#define MAX 100000000
using namespace std;
int N;
vector<bool> primes;
vector<int> ans;

void getPrimes() {
  for (int i = 2; i * i <= MAX; i++) {
    if (!primes[i])
      continue;
    for (int j = 2 * i; j <= MAX; j += i) {
      primes[j] = false;
    }
  }
}

void solve(){
  if(N < 8){
    cout << "Impossible.\n";
    return;
  }
  if(N%2 == 0){
    //짝수면
    N-=4; //2,2 
    ans[0] = 2;
    ans[1] = 2;
  }
  else{
    //홀수면
    N-=5; //2,3
    ans[0] = 2;
    ans[1] = 3;
  }
  bool flag = false;
  for(int i = 2; i < primes.size(); i++){
    if(primes[N - i]){
      ans[2] = i;
      ans[3] = N-i;
      flag = true;
      break;
    }
  }
  if(flag){
    for(int i = 0; i < 4; i++){
      cout << ans[i] << " ";
    }
    cout << "\n";
  }
  else{
    cout << "Impossible.\n";
  }
}

void solution() {
  while (cin >> N) {
    ans.resize(4, 0); //clear해주고
    solve(); //문제 풀기. 
  }
}

int main() {
  ios_base::sync_with_stdio(false);
  cin.tie(NULL);
  cout.tie(NULL);
  primes.resize(MAX + 1, true);
  getPrimes(); //에라토스테네스의 체
  solution();
  return 0;
}

profile
차근차근 배워나가요

0개의 댓글