https://www.acmicpc.net/problem/1629
1629번: 곱셈
첫째 줄에 A, B, C가 빈 칸을 사이에 두고 순서대로 주어진다. A, B, C는 모두 2,147,483,647 이하의 자연수이다.
www.acmicpc.net
#include<iostream>
int C;
long pow(long A, long B){
if(B == 1){
return A % C;
}
long temp = pow(A, B/2);
//짝수인 경우
if(B % 2 == 0){
return (temp * temp) % C;
}
//홀수인 경우
if(B % 2 == 1){
return (temp * temp) % C * A % C;
}
}
using namespace std;
int main(){
long A;
long B;
cin >> A >> B >> C;
cout<<pow(A, B);
return 0;
}
이 문제에서는 간단하게 생각하면 틀리게 되어있습니다.
일정 크기 이상의 A가 B번만큼 곱하게 되면 2147483647 을 넘어가게 되어 오버플로가 발생합니다.
이 수는 231 - 1와 같습니다.
지수의 성질을 이용해야 하는데,
짝수인 부분은 절반으로 나누고 홀수는 지수가 +1이 처리되었다고 생각하면 됩니다
예시로 2^12 = 2^6 * 2^6 = 2^3 * 2^3 * 2^3 * 2^3 = 2^1 *2^2 * 2^1 *2^2 * 2^1 *2^2 * 2^1 *2^2 *2^1 *2^1
모듈러 산술도 이용해야합니다.
https://sskl660.tistory.com/75
모듈러 산술(Modular Arithmetic)
*모듈러 산술(Modular Arithmetic) -> 모듈러 산술(모듈러 연산)은 정수의 합과 곱을 어떤 주어진 수의 나머지를 이용하여 정의하는 방법을 말한다. -> 쉽게 말해 나머지를 이용한 산술 연산이라고 생
sskl660.tistory.com
'BOJ 백준 > Class 4' 카테고리의 다른 글
백준 1238번, 파티(C, C++) (0) | 2022.01.21 |
---|---|
백준 1932번, 정수 삼각형(C, C++) (0) | 2022.01.21 |
백준 1991번, 트리 순회(C, C++) (0) | 2022.01.21 |
백준 9465번, 스티커(C, C++) (0) | 2022.01.21 |
백준 1916번, 최소비용 구하기(C, C++) (0) | 2022.01.21 |