분류: 수학, 재귀, 분할 정복 /
문제
문제 설명
자연수 A를 B번 곱한 수를 알고 싶다. 단 구하려는 수가 매우 커질 수 있으므로 이를 C로 나눈 나머지를 구하는 프로그램을 작성하시오.
입력
첫째 줄에 A, B, C가 빈 칸을 사이에 두고 순서대로 주어진다. A, B, C는 모두 2,147,483,647 이하의 자연수이다.
출력
첫째 줄에 A를 B번 곱한 수를 C로 나눈 나머지를 출력한다.
풀이
#include <iostream>
using namespace std;
int base, m;
int POW(int e) {
if(e == 1) return base % m;
long long val = POW(e/2);
val = val * val % m;
if(e & 1) val *= base;
return val % m;
}
int main() {
int e;
cin >> base >> e >> m;
cout << POW(e);
}
귀납
- 1승을 계산할 수 있다.
- k승을 안다면 2k와 2k+1을 계산할 수 있다.
따라서, f(n)은 f(n/2)로 계산 가능하다.
'Problem Solving > BOJ' 카테고리의 다른 글
[백준 - 2468] 안전 영역 - C++ (1) | 2023.10.09 |
---|---|
[백준 - 5014] 스타트링크 - C++ (0) | 2023.10.08 |
[백준 - 2667] 단지번호붙이기 - C++ (1) | 2023.10.07 |
[백준 - 2583] 영역 구하기 - C++ (1) | 2023.10.07 |
[백준 - 9734] 순환 소수 - C++ (0) | 2023.10.07 |