티스토리 뷰
두 수의 합이 다른 두 소수의 합으로 표현할 수 있는가에 대한 문제다.
문제에서 A와 B의 범위는 1 이상이므로 합은 2, 3, 4, ...로 나올 수 있다.
이때 A+B가 2 또는 3이라면)
가장 작은 소수 2를 뺐을 때 나머지 0 또는 1이 소수가 아니므로 두 소수의 합으로 표현할 수 없다.
A+B가 4 이상의 짝수라면)
골드바흐의 추측*에 의해 '어지간한 수'까지는 두 소수의 합으로 표현할 수 있다.
* 수학적으로 엄밀한 증명이 이뤄지지는 않았지만, 우리 문제 범위에서는 영향이 없다.
A+B가 4 이상의 홀수라면)
2로 뺀 A+B-2가 소수라면 두 소수의 합으로 표현할 수 있고, A+B-2가 소수가 아니라면 두 소수의 합으로 표현할 수 없다.
예를 들어 19는 2+17의 쌍으로 표현할 수 있다. 하지만 23은 2+21에서 21이 합성수이므로 표현할 수 없다.
A+B가 홀수면서, A+B에 홀수의 소수를 뺀 결과가 2가 아닐 때, 반드시 짝수는 소수가 아니므로 두 소수의 합으로 표현할 수 없는 것이다.
따라서 A+B-2가 소수인지만 판명하면 되는 문제이므로, 10^12개의 입력 수에서 소수를 판정하면 된다.
이는 Miller-Rabin 판별법을 사용하면 간단하게 해결된다. Java, Kotlin을 사용한다면 BigInteger의 isProbablePrime 메소드를 사용해도 좋다.
마지막 경우의 수를 제외하고는 미리 상수시간에 해결해두고, 마지막 경우만 빠른 소수 판별법을 활용하도록 하자.
Miller-Rabin 소수 판별은 다른 문제에서도 많이 활용되니 미리 구현해두면 요긴하게 사용할 수 있다.
'간단 문제 풀이' 카테고리의 다른 글
백준 1419: 등차수열의 합 (0) | 2021.10.13 |
---|---|
백준 9464: 직사각형 집합 (0) | 2021.10.06 |
[C 터렛] 백준 1002 (0) | 2018.01.21 |
[C 알고리즘] 그놈에 다이아몬드 찍기 (0) | 2018.01.11 |
[C 문자] 문자열의 길이대로 정렬 (0) | 2017.12.22 |
- Total
- Today
- Yesterday
- rule_of_five
- c++ struct
- OOP
- CM11
- 객체지향
- linaro
- rule_of_three
- inline class
- Java
- dokdo project
- CM10.2
- LG
- c++11
- C++
- C++ 업캐스팅
- cyanogenmod
- Kotlin
- f320k
- vector
- f320s
- dokdo 4.0.3
- G2
- C
- 포인터
- PipelineContext
- dokdo-project
- c++ 상속
- d802
- nodeal
- g2 korea
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |