본문 바로가기

PS/boj

백준 14905 소수 4개의 합

 

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

 

14905번: 소수 4개의 합

모든 자연수를 4개의 소수의 합으로 나타낼 수 있을까? 이 물음에 대한 답은 '8 이상의 모든 자연수에 대해 그렇다'이지만, 데이빗은 그 사실을 알지 못했다. 데이빗은 프로그램을 돌려 4개의 소

www.acmicpc.net

 

골드바흐의 추측을 이용하는 문제였습니다. 

골드바흐의 추측은 "2보다 큰 짝수는 소수 두개의 합으로 나타낼 수 있다."입니다.

우리는 8이상의 어떤 자연수가 주어져도 임의의 소수 두개를 빼서 짝수로 만들 수 있습니다. 

짝수일경우 소수 2 2를 빼면 되고 홀수일경우 소수 2 3을 빼면 됩니다.

소수 4개의 합중 2개의 합을 구했으니 나머지는 미리 에라토스테네스의 체로 소수를 구하고 O(N/2)반복문으로 두개의 합을 만들어 두개가 소수인지 검증만 하면됩니다.

 

#include<stdio.h>
#include<vector>
#include<algorithm>
#include<string>
#include<iostream>
#include<map>
#include<stack>
using namespace std;
bool pn[50000000];
int main(){
    for(int x=2;x<=25000000;x++){
        if(pn[x]) continue;
        for(int y=x*2;y<=50000000;y+=x){
            pn[y]=true;
        }
    }
    int N;
    while(cin>>N){
        if(N<8){
            cout<<"Impossible.\n";
            continue;
        }
        if(N%2==0){
            cout<<"2 2 ";
            N-=4;
        }
        else{
            cout<<"2 3 ";
            N-=5;
        }
        if(N==4){
            cout<<"2 2\n";
            continue;
        }
        for(int x=3;x<=N/2;x+=2){
            if(!pn[x] && !pn[N-x]){
                cout<<x<<" "<<N-x<<'\n';
                break;
            }
        }
    }
}

 

'PS > boj' 카테고리의 다른 글

백준 22345 누적거리  (0) 2022.06.27
백준 2616 소형기관차  (0) 2022.06.26
백준 1594 전화번호 만들기  (0) 2022.06.25
백준 7347 플립과 시프트(C++)  (0) 2021.12.04
백준 3042 트리플렛(C++)  (0) 2021.12.03