A와 X가 10^18까지 주어질 때 A의 X제곱을 1,000,000,007로 나눈 나머지를 구한다.
보통4수학비트 연산분할 정복면접 대비아직 제출이 없습니다시간 제한1초메모리 제한512 MB두 정수 A와 X가 주어질 때 AX를 구하는 방법을 생각해 보자. 이 값은 매우 커질 수 있으므로 109+7로 나눈 나머지를 구한다. amodx를 a를 x로 나눈 나머지라고 하면
(a×b)modx={(amodx)×(bmodx)}modx
가 성립한다. 두 정수를 1,000,000,007로 나눈 나머지만 알아도 두 수를 곱한 값의 나머지를 계산할 수 있다는 뜻이다.
그렇다면 A를 X번 곱해서 AX를 구하면 될 것처럼 보인다. 그러나 X가 64비트 정수 범위까지 커지면 하나씩 곱하는 방식으로는 답을 얻는 데 걸리는 시간이 지나치게 길다. 그래서 곱셈 횟수를 다음과 같이 줄인다.
A를 하나씩 곱하면 시간이 X에 비례하지만, 위 방법을 쓰면 logX에 비례한다. AX를 109+7로 나눈 나머지를 구하는 프로그램을 작성하라.
첫째 줄에 정수 A가 주어진다. (1≤A≤1018)
둘째 줄에 정수 X가 주어진다. (1≤X≤1018)
AX를 1,000,000,007로 나눈 나머지를 한 줄에 출력한다.