The Way

5월 27일 백준 (1456, 5641, 4134, 9176, 4233) 본문

PS/백준 온라인 저지

5월 27일 백준 (1456, 5641, 4134, 9176, 4233)

Jeonggyun 2019. 5. 28. 04:06

소수 컬렉션을 풀어보았다.



백준 1456: 거의 소수

범위가 10^14이다. 다행히 N제곱 꼴인 경우를 물어봤으므로, 10^7까지의 소수를 미리 구해놓고, 2제곱/3제곱/...을 잘 세어보면 된다.

코드의 생명은 오버플로우 관리. 예를 들어서, 소수 p를 곱해가면서 b보다 커질 때까지 한다고 하면, b가 10^14라고 하면 10^7보다 약간 작은 소수에 대해서는 10^21 정도까지 가게 되는데, 이는 long long 범위도 넘어선다. 적당히 max값을 잡는 것이 이롭다.




백준 5641번: 분명한 쌍둥이 소수

흥미로운 문제. p와 p + 2가 모두 소수일 때, (p, p + 2)를 쌍둥이 소수라고 하는 것은 다들 잘 알 것이다.

문제는 3500~5000 자리의 쌍둥이 소수를 아무거나 출력하라는 것. 이 문제는 사실 못 푸는 문제다.

다행히도, 문제에서 쌍둥이 소수 말고 분명한 쌍둥이 소수를 쓰라고 하는데, 이는 주어진 t 이하의 수로만 나누어 떨어지지 않으면 된다.

가장 쉬운 방법은, t 이하의 모든 소수를 곱한다음에 $\pm1$을 해주면, 어떤 수로도 나누어떨어지지 않는다.

t 이하의 모든 소수를 곱하면 3421자리의 수가 나온다. 3500자리라는 뜬금없는 길이가 왜 나왔는지 깨달을 수 있는 부분이다.

1을 빼고, 9를 적당히 붙여주면 완성이다.

큰 수의 곱이 나오므로 python으로 풀었다.




백준 4134번: 다음 소수

주어진 수보다 같거나 큰, 바로 다음의 소수를 출력하라는 문제.

소수 판정법(https://jeonggyun.tistory.com/226)을 사용하면 그냥 1씩 올려가며 찾을 수 있다.


연속하는 합성수의 길이 중 가장 긴 것이 얼마인지 문득 궁금해졌다. int범위에서만 돌려본 결과, 1453168142~1453168432까지 291짜리 합성수 sequence가 가장 길다.




백준 9176번: 메르센 합성수

2^p -1 (p는 소수) 꼴은 보통 소수인데, 이를 메르센 소수라고 한다. 합성수이면 메르센 합성수라고 부른다. 이를 출력하는 문제.

사실 이 문제는 2^61 - 1이 메르센 소수인데, 이를 테스트하는 데에 시간을 거의 잡아먹는다.

이렇게 n이 한정되어 있고, 시간초과가 간당간당해보이는 문제는 전형적인 해결책이 있는데, 바로 로컬 컴퓨터에서 돌린 다음에 그 결과를 코드에 그냥 집어넣는 것.

n이 80 정도면 이렇게 작성해야만 풀 수 있을 것 같다. 나는 그냥 61 이하만 테스트하는 식으로 작성하였다.




백준 4233번: 가짜소수

페르마의 소정리를 만족하지만, 실제로는 소수가 아닌 쌍을 출력하는 문제이다.

소수 판별을 먼저 하고, 그 다음 주어진 식을 판별해야 한다.

유의할 점은 $a^p \equiv a (\text{mod} p)$와 $a^{p-1} \equiv 1 (\text{mod} p)$가 같지 않다는 점. p가 소수일 때는 같지만, 이 문제에서는 p가 소수가 아닐 수 있기 때문이다. 괜히 이상하게 했다 틀렸습니다만 하나 추가되었다...



Comments