๐Ÿ•๏ธ 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;
}

/*
 */
๋ฐ˜์‘ํ˜•