문제

 

 

풀이

 주어질 수 있는 n의 최댓값이 1000000이므로 arr[1000001]을 선언하고 arr[i] = i가 되도록 채워준다.

이후 에라토스테네스의 체 방법을 이용해 소수가 아닌 수들을 걸러낸 후 더해서 n이 될 수 있는 두 소수들을 구한다. 두 소수가 같다면 cnt++을 한 번 더 해주고 cnt를 2로 나눈 몫을 리턴한다.

#include <iostream>

using namespace std;

int arr[1000001] = { 0, };

int main() {
	ios_base::sync_with_stdio(false); 
	cin.tie(NULL); 
	cout.tie(NULL);
    
    int t, n;

    for (int i = 2; i <= 1000000; i++)
        arr[i] = i;

    for (int i = 2; i * i <= 1000000; i++) {
        if (arr[i] == 0) continue;

        for (int j = i * i; j <= 1000000; j += i)
            arr[j] = 0;
    }

    cin >> t;

    for (int i = 0; i < t; i++) {
        int cnt = 0;

        cin >> n;

        for (int j = 2; j < n; j++) {
            if (arr[n - j] + arr[j] == n) {
                cnt++;

                if (n - j == j)
                    cnt++;
            }
        }

        cout << cnt / 2 << "\n";
    }

	return 0;
}

'백준 > 약수, 배수와 소수' 카테고리의 다른 글

13909번: 창문 닫기 [C++]  (0) 2023.03.29
4948번: 베르트랑 공준 [C++]  (0) 2023.03.29
1929번: 소수 구하기 [C++]  (0) 2023.03.29
4134번: 다음 소수 [C++]  (0) 2023.03.29
2485번: 가로수 [C++]  (0) 2023.03.29

+ Recent posts