위 문제는 일반 for문으로 풀면 O(N)의 시간이 걸리는데 B의 최대가 21억이 넘으므로 B가 최대일 때 21초가 걸린다. 하지만 문제의 시간제한은 0.5초이므로 분할정복을 이용하여 O(logN)의 시간복잡도를 이용하여 풀이를 해야한다.
#include <iostream>
using namespace std;
int C;
long long fun(int a, int b) {
if (b == 1) {return a%C;}
long long k = fun(a, b / 2)%C;
if (b % 2 == 0) { //짝수일 때
return k*k%C;
}
else { // 홀수일 때
return (a * k%C * k)%C;
}
}
int main() {
ios_base::sync_with_stdio(false);cin.tie(NULL);cout.tie(NULL);
int A, B;
cin >> A >> B >> C;
cout<<fun(A, B)%C;
return 0;
}
return (a * k * k)%C
-> return (a * k%C * k)%C;
a = 2,147,483,647(21억)
b = 2
이면 int형을 벗어나므로 자료형은 long long을 써야한다.