𝘚𝘭𝘰𝘸 𝘣𝘢𝘡 𝘴𝘡𝘦𝘒π˜₯𝘺

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

μ½”λ”©ν…ŒμŠ€νŠΈ μ€€λΉ„/λ°±μ€€

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

.23 2021. 8. 22. 23:43
문제

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."을 좜λ ₯ν•œλ‹€.


넓은 λ²”μœ„ λ‚΄μ˜ μ†Œμˆ˜λ₯Ό νŒμ •ν•  수 μžˆλŠ” μ—λΌν† μŠ€ν…Œλ„€μŠ€μ˜ 체λ₯Ό μ΄μš©ν•˜μ—¬ ν’€ 수 μžˆλŠ” 문제.

μ•žμ„œ μ„€λͺ…ν•˜μ˜€λ˜ μ—λΌν† μŠ€ν…Œλ„€μŠ€μ˜ 체(1929번 μ†Œμˆ˜κ΅¬ν•˜κΈ°)λ₯Ό μ΄μš©ν•˜μ—¬ [2, 1000000] λ²”μœ„ μ•ˆμ— μžˆλŠ” μ†Œμˆ˜λ₯Ό 미리 νŒλ³„ν•΄λ†“κ³ , κ·Έ ν›„ μž…λ ₯받은 ν•΄λ‹Ή μˆ«μžκ°€ μ†Œμˆ˜μ˜ ν•©μœΌλ‘œ λ‚˜νƒ€λ‚Ό 수 μžˆλŠ”μ§€ λ°˜λ³΅λ¬Έμ„ 톡해 κ΅¬ν•˜λ©΄ λœλ‹€. 이 λ•Œ, b - a의 값이 κ°€μž₯ μ»€μ•Όν•˜κΈ° λ•Œλ¬Έμ— 반볡문의 λ²”μœ„λŠ” iλ₯Ό nλΆ€ν„° (n / 2)κΉŒμ§€ 1μ”© κ°μ†Œμ‹œμΌœκ°€λ©° κ΅¬ν•œλ‹€.

 

+) bool μžλ£Œν˜•μ˜ λ³€μˆ˜ flagλ₯Ό 톡해 ν•œ λ²ˆμ΄λΌλ„ μ†Œμˆ˜μ˜ ν•©μœΌλ‘œ λ‚˜νƒ€λ‚Ό 수 μžˆμ„ 경우 trueλ₯Ό, μ—†λŠ” 경우 false의 값을 μœ μ§€ν•˜μ—¬ μ΅œμ’…μ μœΌλ‘œ λͺ¨λ“  λ°˜λ³΅λ¬Έμ„ λŒμ•˜μ„ λ•Œ flag의 값이 false일 경우 κ³¨λ“œλ°”νμ˜ 좔츑이 ν‹€λ Έλ‹€κ³  좜λ ₯μ‹œν‚€λ„λ‘ ν•˜μ˜€λŠ”λ°, 1000000κΉŒμ§€μ˜ μ •μˆ˜ 쀑 κ³¨λ“œλ°”νμ˜ 좔츑이 ν‹€λ¦¬λŠ” κ²½μš°λŠ” μ—†κΈ° λ•Œλ¬Έμ— 사싀 좔츑이 ν‹€λ ΈλŠ”μ§€ μΆ”λ‘ ν•˜λŠ” 뢀뢄이 없어도 정닡이 ν†΅κ³Όλœλ‹€κ³  ν•œλ‹€.

 

μ½”λ“œ
#include <cstdio>
#include <vector>

using namespace std;

int main(void) {
    vector<int> prime(1000001, 0);
    prime[0] = prime[1] = -1;
    for(int i = 2; i * i <= 1000000; i++) {
        if(prime[i] == -1) continue;
        for(int j = 2 * i; j <= 1000000; j += i) {
            if(prime[j] == -1)  continue;
            else prime[j] = -1;
        }
    }

    int n;
    while(true) {
        bool flag = false;
        scanf("%d", &n);
        if(n == 0) break;

        for(int i = n; i >= (n / 2); i--) {
            if(prime[i] >= 0 && prime[n - i] >= 0) {
                printf("%d = %d + %d\n", n, n - i, i);
                flag = true;
                break;
            }
        }
        if(!flag) printf("Goldbach's conjecture is wrong.\n");
    }
    return 0;
}
Comments