본문 바로가기
백준

[1629] 곱셈

by kmyobin 2023. 2. 6.


https://www.acmicpc.net/problem/1629

 

1629번: 곱셈

첫째 줄에 A, B, C가 빈 칸을 사이에 두고 순서대로 주어진다. A, B, C는 모두 2,147,483,647 이하의 자연수이다.

www.acmicpc.net

 

분할 정복 문제이다. 

거듭제곱을 분할정복으로 풀 수 있다는 것을 처음 알게 되었다!

 

제곱하는 횟수가 짝수라면 위의 식을, 홀수라면 아래식을 이용하면 된다.

세상에는 참 천재가 많은 듯 ,,

 

 

이렇게 한다고 끝이 아니고 숫자가 너무 커질 것을 대비하여 C로 나눈 나머지를 출력해야한다.

따라서 모든 계산 과정에다가 "%C"를 붙여주었다. 

그리고 범위를 생각하여 long long으로 잡았다. 안그러면 오류 난다!

#include <iostream>
using namespace std;

long long A, B, C;

// 분할정복 거듭제곱 알고리즘
long long dcsquare(long long a, long long b) {
	if (b == 1)return a % C;
	if (b % 2 == 0) {
		// even
		long long x = dcsquare(a, b / 2) % C;
		return (x * x) % C;
	}
	else {
		// odd
		long long x = dcsquare(a, (b - 1) / 2) % C;
		return ((x * x) % C * a) % C;
	}
}

int main() {
	ios_base::sync_with_stdio(false);
	cin.tie(NULL);
	cout.tie(NULL);

	cin >> A >> B >> C;
	cout << dcsquare(A, B);
}

'백준' 카테고리의 다른 글

[11444] 피보나치 수 6  (0) 2023.02.08
[10830] 행렬 곱셈  (0) 2023.02.08
[1992] 쿼드트리  (0) 2023.02.04
[1780] 종이의 개수  (0) 2023.02.03
[5430] AC  (0) 2023.01.31

댓글