[C++]백준1629번 곱셈

less than 1 minute read

오늘은 백준1629번 곱셈 문제를 풀어보도록 하자. 문제는 되게 간단하다 (문제만). 만일 하나하나 계산한다면

O(N)으로 시간제한 0.5초를 무조건 넘기게 된다. 하지만 분할정복 알고리즘을 이용하면 O(logN)으로 시간복잡도는 확 줄게 된다.

따라서 위 문제는 분할정복으로 풀어야한다..

데이터 범위가 21억으로 int범위 끝까지 갈 수 있고 곱셈이기 때문에 long long 타입으로 잡아줘야한다. 그리고 long long으로 잡아도

터질 수 있으므로 modulation연산을 적재적소에 해줘야 한다.

문제는 다음과 같다.

                               [접근법]

  1. 생각을 해보자. 만일 2^16이 있다면 2를 16번 곱하는 것보다 2^8을 2번 곱하는 것이 빠를 것이다. 이런 아이디어를 이용하여 재귀적으로 풀어가는 것이 분할정복이다.
  
  2. 2로 계속 나눠주면서 제곱을 해주고 modulation연산을 해준다.

  3. 마지막에 만일 B가 홀수였다면 A을 한 번 더 곱해주는 것을 잊지 말자.(물론 modulation 연산도 잊지 말아야 한다.)
                                     [코드]
#include <iostream>
using namespace std;

long long calculation(long long A, long long B, long long C) {
	if (B == 0) {
		return 1;
	}
	long long result = calculation(A, B / 2, C);
	result = result * result % C;

	if (B % 2 == 0) {
		return result;
	}
	else {
		return (result * A) % C;
	}
}

int main() {
	long long A, B, C;

	cin >> A >> B >> C;

	cout << calculation(A, B, C) << '\n';
	return 0;
}