빠른 거듭제곱
면접 대비시간 제한1초메모리 제한512 MB
A와 X가 10^18까지 주어질 때 A의 X제곱을 1,000,000,007로 나눈 나머지를 구한다.
문제
두 정수 와 가 주어질 때 를 구하는 방법을 생각해 보자. 이 값은 매우 커질 수 있으므로 로 나눈 나머지를 구한다. 를 를 로 나눈 나머지라고 하면
가 성립한다. 두 정수를 1,000,000,007로 나눈 나머지만 알아도 두 수를 곱한 값의 나머지를 계산할 수 있다는 뜻이다.
그렇다면 를 번 곱해서 를 구하면 될 것처럼 보인다. 그러나 가 64비트 정수 범위까지 커지면 하나씩 곱하는 방식으로는 답을 얻는 데 걸리는 시간이 지나치게 길다. 그래서 곱셈 횟수를 다음과 같이 줄인다.
- 먼저 을 차례로 계산한다. 각 수는 바로 앞의 수를 제곱해서 얻고, 지수가 를 넘지 않는 시점까지만 계산하면 충분하다. 가 64비트 정수 범위이므로 계산하는 수는 64개보다 적다.
- 이제 를 이진수로 나타낸다. 예를 들어 이면 이고, 지수법칙에 따라 이 성립한다. 1번 단계에서 미리 계산해 둔 수 몇 개만 곱하면 가 나온다.
를 하나씩 곱하면 시간이 에 비례하지만, 위 방법을 쓰면 에 비례한다. 를 로 나눈 나머지를 구하는 프로그램을 작성하라.
입력
첫째 줄에 정수 가 주어진다. ()
둘째 줄에 정수 가 주어진다. ()
출력
를 1,000,000,007로 나눈 나머지를 한 줄에 출력한다.