본문 바로가기

알고리즘/백준 문제 풀이

[Python] 12445번 バクテリアの増殖 (Small)

728x90

https://www.acmicpc.net/problem/12445

 

12445번: バクテリアの増殖 (Small)

微生物の研究者であるパスカルは、特殊な増殖の傾向を示すバクテリアを発見した。どうやらそのバクテリアは、ある時点で x 個存在したとすると、理想的な環境下では1時間後に xx 個に増

www.acmicpc.net


 

24/02/09

 

 

아주 아주 간단한 문제로, 파이썬으로 해결하기에 아주 적절한 문제다.


 

문제 접근 방식:

 

 

이 문제는 Small버전이 존재하고 Large버전이 존재한다.

 

Large버전의 경우, Power tower류의 문제로, 정수론을 배워야 풀 수 있는 문제다.

 

https://www.acmicpc.net/problem/13970

 

13970번: Power towers

In this example, as M = 10, we are interested in the last decimal digit of each power tower. Notice that, except for the first three power towers and the last one, all the others are too large to be represented with 32 or 64 bit integers.

www.acmicpc.net

 

하지만 Small버전은 그 제한이 매우 작기 때문에, 파이썬으로 아주 간단하게 구현할 수 있다.

 

문제를 해석하면 다음과 같다.

 

$x$마리의 박테리아는 $1$시간이 지날 때 마다 $x^x$마리의 박테리아로 증식한다.

 

$A$마리의 박테리아가 $B$시간 후 몇 마리가 될지 $C$로 나눈 나머지를 출력하면 된다.

 

Small문제의 경우 $B$가 $1$또는 $2$로 제한되어 있다.

 

또한 $A$의 제한이 $1000$까지로, 매우 작다.

 

파이썬은 $1000^{1000}$은 너끈히 계산할 수 있으므로, 그냥 이를 그대로 구현하면 된다.

 

pow함수는 밑, 지수, 나머지의 세 인자를 받아 $a^b$를 나머지로 나눈 값을 출력해 주는 아주 좋은 함수다.

 

또한, 파이썬의 pow함수는 분할 정복을 이용한 거듭제곱으로 구현되어있기 때문에 $\mathcal{O}(\mathrm{log}N)$이라는 빠른 시간 복잡도로 구할 수 있다.

 

이 함수를 사용하면 빠르게 해결할 수 있다. 


아래는 내가 위의 접근 방식과 같이 작성한 파이썬 코드이다. 더보기를 누르면 확인할 수 있다.

더보기
# 12445번 バクテリアの増殖 (Small)
# 수학, 분할정복을 이용한 거듭제곱
import sys
input = sys.stdin.readline

def main():
    T = int(input())
    for i in range(1, T+1):
        a, b, c = map(int, input().rstrip().split())
        if b == 1:
            print(f'Case #{i}:', pow(a, a, c))
        else:
            print(f'Case #{i}:', pow(pow(a, a), pow(a, a), c))

main()

'알고리즘 > 백준 문제 풀이' 카테고리의 다른 글

[Python] 2608번 로마 숫자  (0) 2024.02.28
[Python] 11037번 중복 없는 수  (0) 2024.02.28
[Python] 27114번 조교의 맹연습  (0) 2024.02.27
[Python] 28303번 자석  (0) 2024.02.27
[Python] 18116번 로봇 조립  (0) 2024.02.26