백준 1629 곱셈 (C++)

안유태·2022년 10월 13일
0

알고리즘

목록 보기
55/239

1629번: 곱셈

분할 정복을 이용한 문제이다. 거듭 제곱을 분할 정복을 활용하여 더 빠르게 구할 수 있다. 예를들어 2^8 = 2^4 * 2^4와 같이 2를 8번 곱하는 것이 아닌 2를 4번 곱한 수끼리 곱하면 빠르게 값을 알 수 있다. 즉 아래와 같다.

값이 long long 범위를 벗어날 수 도 있기때문에 중간 중간에 C로 나눈 나머지를 반환해주었다.
C로 나누는 부분때문에 시간이 오래 걸렸다. 주의하자.



#include <iostream>

using namespace std;

long long A, B, C;

long long  dq(long long a, long long b) {
    if (b == 1) {
        return a % C;
    }
    else {
        long long x = dq(a, b / 2) % C;
        if (b % 2 == 0) {
            return x * x % C;
        }
        else {
            return x * x % C * a % C;
        }
    }
}

void solution() {
    cout << dq(A, B) % C;
}

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

    cin >> A >> B >> C;

    solution();

    return 0;
}
profile
공부하는 개발자

0개의 댓글