[백준/코틀린] 1629번: 곱셈
실버 1
링크
풀이
aⁿ을 그대로 계산하면 O(n) 시간이 걸리기 때문에,
분할 정복을 이용한 거듭제곱으로 O(log n)에 해결합니다.
n이 홀수라면 → $a^n = a \cdot a^{n-1}$n이 짝수라면 → $a^n = (a^{n/2})^2$
모듈러 연산을 통해 오버플로우(overflow)를 방지하고,
메모이제이션(Memoization)으로 중복 계산을 방지합니다.
코드
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
val powerCache = HashMap<Long, Long>()
fun power(a: Long, b: Long, c: Long): Long {
if (powerCache[b] != null) return powerCache.getValue(b)
return when {
b == 0L -> 1L
b % 2 != 0L -> a * power(a, b - 1, c) % c
else -> power(a, b / 2, c) * power(a, b / 2, c) % c
}.also { powerCache[b] = it }
}
fun main() {
val (a, b, c) = readln().split(" ").map { it.toLong() }
println(power(a, b, c))
}
This post is licensed under CC BY 4.0 by the author.