골드바흐의 추측에 따르면, 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;
}
