C++) 백준 #17103: 골드바흐 파티션

https://bbty97.manage/newpost/?type=post&returnURL=%2Fmanage%2Fposts%2F

배수, 약수, 소수에 대해 이렇게 많은 글을 올릴 줄은 몰랐는데 다들 아시겠지만 종에 따라 시차가 많이 다른 것을 보면 여러 각도에서 바라보는 것이 얼마나 중요한지 다시 한 번 깨닫게 됩니다.
알고리즘이 구현됩니다.

< Ansatz 1 - Fehler >

이전 소수 문제에서 사용한 알고리즘 √n을 다시 사용했습니다.

예를 들어 6은 2부터 모든 숫자를 세어 3 + 3 = 6을 찾습니다.


순서쌍 (2, 3)과 (3, 2)는 어쨌든 동일하게 취급되므로 6의 절반인 3까지만 세면 됩니다.
가지수가 급격하게 줄었으니 아마도…? 나는 그것을 할 의도로 시도했지만 시간이 초과되었습니다.
시간 복잡도는 O(n^4)이므로 자연스러워 보입니다.

< Ansatz 2 - Erfolg >

이번에는 방법을 몰라서 구글에 도움을 요청했습니다.
“에라토스테네스의 체”라는 기술을 사용했기 때문에 살펴보고 먼저 배열을 할당하는 것부터 시작했습니다.
이 방법은 그리 오래 걸리지 않은 것 같습니다.
방법은 간단했습니다.
입력 값의 범위와 마찬가지로 배열이 먼저 생성되고 초기화되며 2부터 시작하여 해당 숫자의 배수는 배열의 값을 0으로 만들고 끝에 소수만 남깁니다.

여기 소스. https://velog.io/@max9106/algorithm-%EC%97%90%EB%9D%BC%ED%86%A0%EC%8A%A4%ED%85%8C%EB%84%A4% EC%8A%A4%EC%9D%98-%EC%B2%B4

(알고리즘) 에라토스테네스의 체

에라토스테네스의 체란? 소수를 결정하는 알고리즘입니다.
큰 집합에서 소수를 찾는 빠르고 정확한 방법입니다.
단일 숫자가 소수인지 확인 숫자가 소수인지 확인할 때 특정 숫자

velog.io

에라토스테네스의 체 구현은 동일하지만 골드바흐 파티션 카운팅 알고리즘은 약간 다르게 구현됩니다.
위 블로그에서 같은 번호가 나오면 e.g. 5 + 5 = 10, 하나 더 세고 마지막으로 /2, 위에 쓴 것처럼 처음에는 n/2까지만 세었습니다.

아래는 코드입니다.

#포함하다
#포함하다
#포함하다
#포함하다

#define MAX 1000000

네임스페이스 std 포함;

int arr(최대 + 1);

정수 메인()
{
ios_base::sync_with_stdio(거짓);
친 타이(ZERO);
cout.tie(NULL);

for (int i = 2; i <= MAX; i++) {
arr(i) = I;
}

for (int i = 2; i <= sqrt(MAX); i++) {
if (arr(i) == 0)
계속해;
for (int j = i * i; j <= MAX; j += i)
anr(j) = 0;
}

정수 T;
cin >> T;

정수 n;
for (int i = 0; i < T; i++) {
정수 카운터 = 0;
cin >> n;
for (int j = 2; j <= n/2; j++) {
if (arr(j) + arr(n – j) == n)
카운트++;
}
cout << 개수 << endl;
}

0을 반환합니다.

}