출처 : 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 |