수학과의 좌충우돌 프로그래밍

[C++] BAEKJOON 1629 곱셈 본문

알고리즘/C++

[C++] BAEKJOON 1629 곱셈

ssung.k 2019. 9. 8. 17:54

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

 

1629번: 곱셈

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

www.acmicpc.net

단순히 사칙연산 처럼 보이는 문제입니다. 그렇게 때문에 19년 9월 8일 문제를 푼 시점에 정확도는 25%로 매우 낮지만 정확도 만큼 어려운 문제는 아니었습니다.

분할 정복을 이용한 a^b

 

[Algorithm] 분할 정복을 이용한 a^b

a^b, a 제곱 b 는 일반적으로 다음과 같이 구현할 수 있습니다. int pow(int a,int b){ int result = 1; for (int i=0;i<b;i++){ result="" *="a;" }="" return="" result;="" a^b="" 의="" 의미="" 그대로="" a="" 를="" b="" 번="" 곱하여="" 원하는="" 결..<="" p=""> </b;i++){>

ssungkang.tistory.com

위 개념을 이용하면 제곱의 복잡도를 O(b) 에서 O(log b) 로 줄여 문제를 해결할 수 있습니다.

#include <iostream>

using namespace std;

long long pow(long long a, long long b, long long c){
    a = a % c;
    
    if (b==0) return 1;
    else if (b==1) return a;
    else if (b%2==0){
        long long temp = pow(a,b/2,c);
        return temp*temp%c;
    }
    else return a*pow(a,b-1,c)%c;
}

int main(int argc, const char * argv[]) {
    
    long long a,b,c;
    cin >> a >> b >> c;
    cout << pow(a,b,c) << "\n";

    return 0;
}

 

'알고리즘 > C++' 카테고리의 다른 글

[C++] BAEKJOON 1931회의실 배정  (0) 2019.09.14
[C++] BAEKJOON 10830 행렬 제곱  (0) 2019.09.10
[C++] BAEKJOON 11049 행렬 곱셈 순서  (0) 2019.09.08
[C++] BAEKJOON 11066 파일합치기  (0) 2019.09.07
[C++] BAEKJOON 1520 내리막길  (0) 2019.09.07
Comments