A를 B번 곱한 수를 C로 나눈 나머지를 출력하는 문제.
자칫 높아질 수 있는 시간 및 공간 복잡도를 해결하기 위해 재귀 함수 및 모듈로 연산을 활용한다.
재귀 함수 go
를 통해, B
의 값을 반으로 나누어가며 A
의 B
제곱을 분할 계산한다. 이때 과정 중간중간, 계산 값을 C
로 나누어, 값이 너무 커지는 위험을 방지한다.
마지막 결괏값에서만 C
로 나눈 나머지를 구하는 것이 아니라, 과정 속에서 수시로 모듈로 연산을 통해 값을 작게 만들어주어야 함에 주의하자.
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
ll A, B, C;
ll go(ll a, ll b) {
if (b == 1) return a % C;
ll ret = go(a, b / 2);
if (b % 2) return ((ret * ret) % C * a) % C;
else return (ret * ret) % C;
}
int main() {
cin >> A >> B >> C;
cout << go(A % C, B) << '\n';
return 0;
}