$x^n$을 단순히 for문으로 구한다고 하면 $O(n)$만큼의 시간이 걸립니다.
이를 분할정복을 이용해서 빠르게 구할 수 있습니다.
$2^{100}$을 구한다고 해보겠습니다.
$2^{100} = 2^{50} * 2^{50}$입니다. 그럼 $2^{50}$을 구한다면 그 수를 제곱해서 $2^{100}$을 구할 수 있습니다.
마찬가지로 $2^{50} = 2^{25} * 2^{25}$입니다. 그럼 $2^{25}$을 구한다면 그 수를 제곱해서 $2^{50}$을 구할 수 있습니다.
$2^{25}$는 2로 나누어지지 않습니다. 이런 경우에는 $2^{12}*2^{12}*2$를 이용하면 됩니다.
이런 식으로 진행하면 $O(log n)$에 구할 수 있습니다.
보통 이런 종류의 문제는 $x^n$을 $m$으로 나눈 나머지를 구하는 경우가 많습니다. $xy\,\bmod\,m = x\,\bmod\,m * y\,\bmod\,m $이므로 각 연산마다 $m$으로 나눈 나머지를 취해주면 됩니다.
#include<iostream>
using namespace std;
int pow(int n, int p, int m) {
if (p == 0) return 1;
if (p == 1) return n;
int tmp = pow(n, p / 2, m);
if (p % 2 == 0) return tmp * tmp % m;
else return tmp * tmp % m * n % m;
}
int main() {
int n, p, m;
cin >> n >> p >> m;
printf("%d", pow(n, p, m));
return 0;
}
'PS - 알고리즘' 카테고리의 다른 글
백준 13573 - 동전 뒤집기 3 (1) | 2024.03.23 |
---|---|
SOS dp (0) | 2024.03.21 |
백준 14854 - 이항 계수 6 (0) | 2024.03.16 |
x/y (mod n) 계산 (3) | 2024.03.16 |
N!에서 소수 p 등장 횟수 구하기 (0) | 2024.03.16 |