문제
백준 15711
설명
A+B=S
가 주어졌을 때 S 가 두 소수의 합으로 되는지를 구하는 문제이다.
S
가 짝수라면
S > 2
이면 그 유명한 골드바흐의 추측 을 사용할 수 있다. 컴퓨터로 몇경 이상을 돌려봤을 때 성립하기 때문에 주어진 범위 내에선 성립하게 된다.
S == 2
이면 불가능이 자명하다
S
가 홀수라면
S-2
가 소수여야 성립한다. 왜냐하면 2 이상의 모든 소수는 홀수이므로 짝수인 소수인 2 와의 합 외에는 답이 될 수 없기 때문이다.
이때 S-2
가 소수인지를 어떻게 구할지가 문제가 된다. S < 2 * 10^12
로 굉장히 큰 수이기 때문이다.
이를 해결하는 방법은 크게 2가지를 많이 사용한다. 하나는 에라스토테네스의 체, 다른 하나는 Miller-Rarbin 의 소수테스트를 사용하는 방법이다.
에라스토테네스 체
코드
시간 복잡도
O(\(148993\))
설명
2*10^12
미만의 수 S
가 소수인지 판정을 하는 브루트포스 방법으로는 sqrt(S)
이하의 모든 소수에 대해서 나누어 떨어지는지 테스트하는 방법이 있다.
이를 위해서 sqrt(2*10^12)
이하의 모든 소수를 에라스토테네스의 체로 미리 구해놓고, 범위 내에 있으면 소수인지만 체크하고, 범위 초과시 위에서 설명한 브루트포스 방법을 사용한다.
Miller-Rarbin
코드
시간 복잡도
O(\((\log{\mathrm{N}})^3\))
설명
말 그대로 알고리즘을 사용하면 된다.
이때 주의점은 10^12
범위의 곱은 long long
범위를 벗어난다는 것이다. 이로인한 오버플로우는 __int128
을 지원하는 환경에서는 문제가 되지 않지만, 그렇지 않다면 위처럼 분할정복을 이용한 모듈러 곱셈을 쓰거나 다른 방법을 사용해야만 한다.
백준에서는 __int128
을 지원한다.
댓글남기기