분할 정복을 이용한 문제이다. 거듭 제곱을 분할 정복을 활용하여 더 빠르게 구할 수 있다. 예를들어 2^8 = 2^4 * 2^4와 같이 2를 8번 곱하는 것이 아닌 2를 4번 곱한 수끼리 곱하면 빠르게 값을 알 수 있다. 즉 아래와 같다.
값이 long long 범위를 벗어날 수 도 있기때문에 중간 중간에 C
로 나눈 나머지를 반환해주었다.
C
로 나누는 부분때문에 시간이 오래 걸렸다. 주의하자.
#include <iostream>
using namespace std;
long long A, B, C;
long long dq(long long a, long long b) {
if (b == 1) {
return a % C;
}
else {
long long x = dq(a, b / 2) % C;
if (b % 2 == 0) {
return x * x % C;
}
else {
return x * x % C * a % C;
}
}
}
void solution() {
cout << dq(A, B) % C;
}
int main() {
ios::sync_with_stdio(false);
cin.tie(NULL); cout.tie(NULL);
cin >> A >> B >> C;
solution();
return 0;
}