728x90
https://www.acmicpc.net/problem/1629
1629번: 곱셈
첫째 줄에 A, B, C가 빈 칸을 사이에 두고 순서대로 주어진다. A, B, C는 모두 2,147,483,647 이하의 자연수이다.
www.acmicpc.net
A^4
인 경우
(A * A) ^ 2 가 된다
즉 (A*A)한 것을 또 A*A 할 필요가 없다
반으로 나누면서 계산된 것은 다시 반복을 제외시킴으로
시간을 단축한다.
단, 계산 중간에 C로 나눈 나머지를 해야하는데
C 보다 큰 경우 나머지를 구해야지,
무조건 하다 보면
나머지가 0인 경우를 잘못반환하게 될 수 있다
그럼 나머지 계산은 다 0이 되므로 주위한다.
#include <iostream>
using namespace std;
int half_mult(long long A,long long B,long long C) {
if (B == 1) {
return A;
}
long long mult = half_mult(A, B / 2, C);
if (mult > C)
mult %= C;
long long result = (mult * mult)%C;
if (B % 2 != 0) {
result *= A;
if (result > C) {
result %= C;
}
}
return result;
}
int main(void) {
long long A, B, C;
cin >> A >> B >> C;
cout << half_mult(A, B, C)%C;
}

728x90
'문제 > 백준' 카테고리의 다른 글
| c++ 백준_16953_"A → B" (0) | 2023.06.11 |
|---|---|
| c++ 백준_1245_"농장 관리" (0) | 2023.06.11 |
| c++_백준_12865_"평범한 배낭" (1) | 2023.06.11 |
| c++ 백준_15663_"N과 M (9)" (0) | 2023.06.11 |
| c++ 백준_11660_"구간 합 구하기 5" (0) | 2023.06.11 |