본문으로 바로가기

백준 01629 - 곱셈

category BOJ 백준/Divide & Conquer 2020. 11. 11. 08:36

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

 

1629번: 곱셈

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

www.acmicpc.net

 

고려사항

  • 10830번 행렬의 거듭제곱 구하기 처럼 분할정복을 이용하여 곱셈의 연산 수를 줄이는 방식
  • long long 의 거듭제곱을 위해 powl( ) 사용.
  • 결과(ans), 지수(b) 와 현재 거듭제곱(tmp)이 있을 때,
    1) 지수  % 2 == 1, 이라면 ans 에 tmp를 곱해준다.
    2) 지수를 반토막 내준다.
    3) tmp를 제곱해준다.
     
#include <iostream>
#include <cmath>
using namespace std;

int main() {
    int a, b, c;
    long long tmp, ans = 1;
    cin>>a>>b>>c;

    tmp = a;
    while(b > 0){
        if(b % 2 == 1){
            ans = (ans * tmp) % c;
        }

        b /= 2;
        tmp = (long long)powl(tmp, 2) % c;
    }

    cout<<ans;
    return 0;
}

'BOJ 백준 > Divide & Conquer' 카테고리의 다른 글

백준 11444 - 피보나치 수 6  (0) 2020.11.11
백준 01780 - 종이의 개수  (0) 2020.11.11
백준 01992 - 쿼드트리  (0) 2020.11.08
백준 02630 - 색종이 만들기  (0) 2020.11.08