시간복잡도를 먼저 봐야하는 문제이다.
0.5초의 시간제한에 2147483647 이하의 입력값에 직접 모든 계산을 돌린다면 엄청난 차이로 시간이 터지게 된다. 때문에 log(n) 이하의 알고리즘을 생각해야 한다.
log 를 보자마자 절반으로 나눠볼까? 라는 생각을 한 뒤 분할하여 값을 구하면 되지 않을까 생각이 든다. 즉 다음과 같은 로직으로 코드를 짤 수 있다.
- 제곱수를 절반으로 쪼개 분할정복
- 틀 만든 뒤 return (?!)
생각보다 간단하게 끝난다. 다만 계산 중간 곱한 뒤 나누는 과정에서 int 의 범위를 벗어날 수 있기 때문에 long long 으로 처리해주어야 한다.
#include <iostream>
using namespace std;
typedef long long LL
LL _get(LL x, LL y, LL z) {
if (y == 1) return x % z;
else {
LL half = _get(x, y / 2, z);
if (y % 2 == 0) {
return (half * half) % z;
}
else {
return (x * ((half * half) % z)) % z;
}
}
}
int main() {
ios_base::sync_with_stdio(false);
cin.tie(NULL);
cout.tie(NULL);
LL a, b, c;
cin >> a >> b >> c;
cout << _get(a, b, c);
return 0;
}
'책장 > 알고리즘' 카테고리의 다른 글
[백준-1021] 회전하는 큐 (0) | 2021.08.12 |
---|---|
[백준-2346] 풍선 터뜨리기 (0) | 2021.08.12 |
[백준-1918] 후위 표기식 (1) | 2021.08.11 |
[백준-20040] 사이클 게임 (0) | 2021.08.11 |