백준 문제풀이

골드바흐 파티션_ 백준 17103

골드바흐 파티션은 이전에 풀었던 골드바흐의 추측과 관련된 문제입니다.

 

2020/05/17 - [백준 문제풀이] - 골드바흐의 추측 _ 백준 6588

 


골드바흐의 추측은 2보다 큰 모든 짝수는 두 홀수 소수의 합으로 나타낼 수 있다. 라는 추측이다.

이번 문제는 이 골드바흐의 추측을 기반으로 짝수 N을 두 소수의 합으로 나타내는 골드바흐 파티션을 구하는 문제이다.

여기서 두 소수의 순서만 다른 것은, 같은 파티션으로 취급한다.

 

에라토스테네스의 체를 활용하여 소수를 먼저 확인해놓고, 그 뒤에 결과값을 출력하는 형식으로 알고리즘을 짜면 된다.

 

골드바흐 파티션을 계산할 때, '두 소수의 순서만 다른 것은, 같은 파티션으로 취급한다.'라는 조건에 따라 해당 값을 반으로 나눈 값까지만 세면 된다. 

 

코드는 다음과 같다.

#include <iostream>
#include <cstdio>

#define MAX 1000000
using namespace std;

bool check[MAX + 1];
int prime[MAX];
int pn = 0;

int main(void)
{
    check[0] = check[1] = true;
    for (int i = 2; i < MAX; i++) // 에라토스테네스의 체 
    {
        if (check[i] == false)
        {
            prime[pn++] = i;
            for (int j = i * 2; j < MAX; j += i)
                check[j] = true;
        }
    }

    int num;
    scanf("%d", &num);

    while (num--)
    {
        int a;
        int result = 0;

        scanf("%d", &a);

        for (int i = 0; prime[i] * 2 <= a; i++) // 절반값까지 result를 센다
        {
            if ((check[a - prime[i]]) == false)
            {
                result++;
            }
        }

        printf("%d\n", result);
    }
    return 0;
}

'백준 문제풀이' 카테고리의 다른 글

1로 만들기_ 백준 1463  (0) 2020.05.23
다이나믹 프로그래밍 기초  (0) 2020.05.23
숨바꼭질6 _ 백준 17087  (0) 2020.05.20
GCD 합 _ 백준 9613  (0) 2020.05.18
팩토리얼 0 의 개수 _ 백준 1676  (0) 2020.05.17