https://www.acmicpc.net/problem/1629
이 문제는 A,B,C가 주어지고 A의 B승을 C로 나눈 나머지를 구하는 문제이다.
이 문제는 A,B,C가 매우 큰 수가 나오므로 통상적으로 거듭제곱을 한다면, 시간복잡도가 O(n)이므로 시간초과가 뜨게 된다. 또한 정수형의 범위도 초과할 수 있으므로 여기서는 분할정복 알고리즘을 응용해야 한다. 필자는 분할정복 알고리즘을 처음 써보기에, https://hbj0209.tistory.com/43 이 블로그를 참고하여 코드를 짰다.
분할정복 알고리즘이란, 복잡한 문제들을 간단한 문제로 쪼개고 쪼개서 간단한 문제 여러 개를 푼 다음 그것을 다시 합쳐서 문제를 해결하는 알고리즘이다.
이러한 분할정복 알고리즘은 기본적으로 아래와 같은 방식으로 짜여진다
def func(x) :
if 문제가 간단:
return 계산값
else 문제가 안 간단:
x를 x1 , x2로 분할
retrun func(x1),func(x2)를 합친 값
그렇다면 지금 푸는 이 문제에서 분할정복 알고리즘을 어떻게 쓸 수 있을까? 거듭제곱이란 결국은 같은 숫자를 계속 곱한다는 것이다. 그러므로 곱해야 할 값을 반으로 쪼개서 따로 처리한다면 더 간단해질 수 있을 것이다. 이렇게 쪼개다 쪼개다 승수가 1이 되면 그대로 리턴하면 될 것이다. 또한 우리는 나머지를 구하는 것이므로 구한느 값을 게속 나머지로 만들어 하면 된다. 거듭제곱의 나머지란 결국 하나하나 숫자의 나머지를 다 곱한것의 나머지와 같은 마련이기 때문이다.
def fpow(C,n,r):
if n==1:
return C%r
else:
x=fpow(C,n//2,r)
if n%2 == 0:
return x*x%r
else:
return x*x*C%r
A,B,C = map(int,input().split())
print(fpow(A,B,C))
'문제해결(PS) > 백준(BOJ)' 카테고리의 다른 글
백준 1991 트리 순회 (1) | 2024.12.29 |
---|---|
백준 1932 정수 삼각형 (0) | 2024.12.28 |
백준 1149 RGB거리 (0) | 2024.12.27 |
백준 16953 A → B (0) | 2024.12.26 |
백준 15666 N과 M (12) (0) | 2024.12.25 |