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 |