https://www.acmicpc.net/problem/1629
1. 분류
수학, 분할정복
2. 풀이
A를 B만큼 제곱한 수를 C로 나누어 나머지를 구하는 문제이다.
입력 범위가 int 한계치(2^32 - 1)기 때문에 자료형은 unsigned long long형으로 잡았다.
입력 한계치가 매우 큰 만큼 B번 거듭제곱할 때 O(N)으로 구하면 무조건 시간 초과가 나게 된다.
B를 반씩 나누어가며 분할정복으로 거듭제곱을 구하면 시간 내에 풀 수 있다.
3. 소스코드
#include <cstdio> typedef unsigned long long ull; ull power(ull x, ull y, ull div) { ull res = 1LL; while (y) { if (y & 1) { res *= x; res %= div; } x *= x; x %= div; y /= 2LL; } return res; } int main() { ull a, b, c; scanf("%llu %llu %llu", &a, &b, &c); printf("%llu\n", power(a, b, c)); return 0; }
'알고리즘' 카테고리의 다른 글
BOJ [2225] 합분해 (0) | 2017.08.15 |
---|---|
BOJ [1920] 수 찾기 (0) | 2017.08.14 |
BOJ [1780] 종이의 개수 (0) | 2017.08.13 |
BOJ [1654] 랜선 자르기 (0) | 2017.08.13 |
BOJ [14501] 퇴사 (0) | 2017.08.13 |