Binary exponentiation(또는 Exponentiation by squaring)이라는 기법을 써주면 O(log n)의 시간복잡도로 a^n을 구할 수 있다. 분할정복을 이용한 거듭제곱이라고 부를 수 있다.
typedef long long ll;
ll binpow(ll a, ll b) {
ll res = 1;
while (b > 0) {
if (b & 1)
res *= a;
a = a * a;
b >>= 1;
}
return res;
}
반복문으로 짠 버전입니다. a(base)를 squaring을 하고, 동시에 b는 오른쪽 쉬프트를 해서 절반씩 줄여나간다. b&1일 때 해당 base를 곱해준다.
ll binpow_recur(ll a, ll b) {
if (b == 0) return 1;
ll res = binpow_recur(a, b/2);
if (b & 1)
return res * res * a;
else
return res * res;
}
재귀 버전.
728x90
'PS' 카테고리의 다른 글
카탈란 수 (0) | 2021.05.25 |
---|---|
.exe을(를) 쓰기용으로 열 수 없습니다. (0) | 2021.03.21 |
쌍따옴표(") 와 역슬래쉬(\) 출력방법 (0) | 2021.03.16 |
알고리즘 공부 순서 (0) | 2021.03.11 |
비트마스크(Bitmask) (0) | 2021.03.01 |