코테풀이/백준

1629번: 곱셈

miimu 2025. 10. 27. 18:34

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