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

그냥 분할 정복을 이용한 거듭 제곱을 구현하고 나누면 끝인 거 아닌가? 라고 생각했는데,
수가 커질 때 나머지를 구하는 연산도 느려지는지 시간초과가 났다.
그래서 어떻게 해야하지 하면서 찾아보던 중
https://deepdata.tistory.com/369
분할정복을 이용한 거듭제곱 빠르게하기
1. 분할정복 문제를 더 이상 나눌 수 없을 때까지 더 작은 문제로 나누면서 이 작은 문제들을 각각 풀면서, 병합하여 전체 문제의 답을 구하는 알고리즘 divide - conquer - combine 방식으로 설계한다.
deepdata.tistory.com
위 블로그에서 중요한 정리를 하나 보여주었다.

이걸 보고 진짜인지 계산을 직접 해보았다.
예시로 $22^{3}$을 12로 나누었을 때 나머지를 구하는 것을 생각해보았다.
$n = 2$일 때,
$ a \times a = 22 \times 22$, $a = 484$
$ a \mod 12 = 4$
이 때 $ a' = a \mod 12$, 즉 $a' = 4$라고 해보자.
$n=3$일 때,
$ a \times a = 484 \times22 $, $a = 10648$
$ a \mod 12 = 4$
이 때, $a'^2 \mod 12 = 16 \mod 12 = 4$
$(22^2)^2 \to (22^2 \mod 12)^2 \to (22^2 \mod 12)^2 \mod 12$
$(a^2)^2 \to (a^2 \mod c)^2 \to (a^2 \mod c)^2 \mod c$
# https://www.acmicpc.net/problem/1629
# 분할정복
import sys
A, B, C = map(int, sys.stdin.readline().split())
def power(a, n, c) :
result = 1
while n :
if n % 2 == 1 : # 홀수
result *= a
a *= a
a = a % c
n = n // 2
return result
result = power(A, B, C)
print(result % C)
'코테풀이 > 백준' 카테고리의 다른 글
| 16565번: N포커 (0) | 2025.11.03 |
|---|---|
| 15824번: 너 봄에는 캡사이신이 맛있단다 (0) | 2025.11.02 |
| 13334번: 철로 (0) | 2025.10.18 |
| 2170번: 선 긋기 (0) | 2025.10.18 |
| 11725번: 트리의 부모 찾기 (0) | 2025.10.13 |