πŸ•οΈ ICPC Sinchon/Basic Math

[BOJ S1][C++] λ°±μ€€ 6588번: κ³¨λ“œλ°”νμ˜ μΆ”μΈ‘

선달 2022. 9. 15. 16:41
λ°˜μ‘ν˜•

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

 

6588번: κ³¨λ“œλ°”νμ˜ μΆ”μΈ‘

각 ν…ŒμŠ€νŠΈ μΌ€μ΄μŠ€μ— λŒ€ν•΄μ„œ, n = a + b ν˜•νƒœλ‘œ 좜λ ₯ν•œλ‹€. μ΄λ•Œ, a와 bλŠ” ν™€μˆ˜ μ†Œμˆ˜μ΄λ‹€. μˆ«μžμ™€ μ—°μ‚°μžλŠ” 곡백 ν•˜λ‚˜λ‘œ κ΅¬λΆ„λ˜μ–΄μ Έ μžˆλ‹€. λ§Œμ•½, n을 λ§Œλ“€ 수 μžˆλŠ” 방법이 μ—¬λŸ¬ 가지라면, b-aκ°€ κ°€μž₯ 큰

www.acmicpc.net

 

문제

1742λ…„, λ…μΌμ˜ μ•„λ§ˆμΆ”μ–΄ μˆ˜ν•™κ°€ ν¬λ¦¬μŠ€ν‹°μ•ˆ κ³¨λ“œλ°”νλŠ” λ ˆμ˜¨ν•˜λ₯΄νŠΈ μ˜€μΌλŸ¬μ—κ²Œ λ‹€μŒκ³Ό 같은 좔츑을 μ œμ•ˆν•˜λŠ” νŽΈμ§€λ₯Ό λ³΄λƒˆλ‹€.

4보닀 큰 λͺ¨λ“  μ§μˆ˜λŠ” 두 ν™€μˆ˜ μ†Œμˆ˜μ˜ ν•©μœΌλ‘œ λ‚˜νƒ€λ‚Ό 수 μžˆλ‹€.

예λ₯Ό λ“€μ–΄ 8은 3 + 5둜 λ‚˜νƒ€λ‚Ό 수 있고, 3κ³Ό 5λŠ” λͺ¨λ‘ ν™€μˆ˜μΈ μ†Œμˆ˜μ΄λ‹€. 또, 20 = 3 + 17 = 7 + 13, 42 = 5 + 37 = 11 + 31 = 13 + 29 = 19 + 23 이닀.

이 좔츑은 아직도 ν•΄κ²°λ˜μ§€ μ•Šμ€ λ¬Έμ œμ΄λ‹€.

백만 μ΄ν•˜μ˜ λͺ¨λ“  μ§μˆ˜μ— λŒ€ν•΄μ„œ, 이 좔츑을 κ²€μ¦ν•˜λŠ” ν”„λ‘œκ·Έλž¨μ„ μž‘μ„±ν•˜μ‹œμ˜€.

μž…λ ₯

μž…λ ₯은 ν•˜λ‚˜ λ˜λŠ” κ·Έ μ΄μƒμ˜ ν…ŒμŠ€νŠΈ μΌ€μ΄μŠ€λ‘œ 이루어져 μžˆλ‹€. ν…ŒμŠ€νŠΈ μΌ€μ΄μŠ€μ˜ κ°œμˆ˜λŠ” 100,000개λ₯Ό λ„˜μ§€ μ•ŠλŠ”λ‹€.

각 ν…ŒμŠ€νŠΈ μΌ€μ΄μŠ€λŠ” 짝수 μ •μˆ˜ n ν•˜λ‚˜λ‘œ 이루어져 μžˆλ‹€. (6 ≤ n ≤ 1000000)

μž…λ ₯의 λ§ˆμ§€λ§‰ μ€„μ—λŠ” 0이 ν•˜λ‚˜ 주어진닀.

좜λ ₯

각 ν…ŒμŠ€νŠΈ μΌ€μ΄μŠ€μ— λŒ€ν•΄μ„œ, n = a + b ν˜•νƒœλ‘œ 좜λ ₯ν•œλ‹€. μ΄λ•Œ, a와 bλŠ” ν™€μˆ˜ μ†Œμˆ˜μ΄λ‹€. μˆ«μžμ™€ μ—°μ‚°μžλŠ” 곡백 ν•˜λ‚˜λ‘œ κ΅¬λΆ„λ˜μ–΄μ Έ μžˆλ‹€. λ§Œμ•½, n을 λ§Œλ“€ 수 μžˆλŠ” 방법이 μ—¬λŸ¬ 가지라면, b-aκ°€ κ°€μž₯ 큰 것을 좜λ ₯ν•œλ‹€. 또, 두 ν™€μˆ˜ μ†Œμˆ˜μ˜ ν•©μœΌλ‘œ n을 λ‚˜νƒ€λ‚Ό 수 μ—†λŠ” κ²½μš°μ—λŠ” "Goldbach's conjecture is wrong."을 좜λ ₯ν•œλ‹€.

 

풀이

μ—λΌν† μŠ€ν…Œλ„€μŠ€μ˜ 체λ₯Ό μ΄μš©ν•΄ μ†Œμˆ˜λ“€μ„ 미리 ꡬ해놓고

μž‘μ€ μ†Œμˆ˜λΆ€ν„° nμ—μ„œ λΊ€ 값도 μ†Œμˆ˜λΌλ©΄ 좜λ ₯ν•œλ‹€.

 

// Authored by : seondal
// Co-authored by : -

// #include <bits/stdc++.h>
#include <iostream>
#include <vector>

using namespace std;

void findPrime(vector<bool> &isPrime) {
    isPrime[0] = isPrime[1] = false;
    
    for(int i=2; i<=1000000; i++) {
        for(int j=i+i; j<=1000000; j+=i) {
            isPrime[j] = false;
        }
    }
}


int main() {
    ios_base :: sync_with_stdio(false);
    cin.tie(NULL); cout.tie(NULL);
    
    vector<bool> isPrime(1000001, true);
    findPrime(isPrime);
    
    int n;
    while(true) {
        cin >> n;
        if(n==0) break;
        
        for(int i=3; i<n; i++) {
            if(isPrime[i] && isPrime[n-i]) {
                cout << n << " = " << i << " + " << n-i << "\n";
                break;
            }
        }
        
    }
    
    
    return 0;
}

/*
 */
λ°˜μ‘ν˜•