Square and Multiply 를 사용하면 매우 큰 수의 거듭제곱에 대해서 효율적으로 계산할 수 있습니다.
예를 들어 a^10 이라는 수가 있다고 가정해보져
그러면 보통 a*a*a*a*a*a*a*a*a*a 이렇게 계산을 하는데 n이 작으면 잘 동작하겠지만
n이 막 10억 100억 이러면 시간내에 들어올 수가 없죠.
그러면 a^10을 조금 바꿔볼께요. 10을 2진수로 표현을 하게되면 1010(2) 가 나오게 됩니다.
이걸 이용해서 a^10을 다시 표현을 해 볼게요
a^2 * a^8 = a^10 이라는 결과를 도출할 수 있고
결과적으로 a^1, a^2, a^4, a^8 ..... 을 이용해서 모든 a^n 을 빠르게 계산할 수 있습니다.
시간복잡도는 O(n) 에서 O(logn) 으로 줄어들게 되고요.
뭔가 빠르게 넘어간거 같지만 잘 생각해보면 알 수 있을꺼에요!!
astrohsy 8년 전
b가 매우 커질 때, 무식하게 다 따라가가지고 시간초과 나는 것은 알겠는데..
그 방법 말고, 어떻게 접근할 수 있지는지 힌트 좀 부탁드립니다. ㅠㅠ