문 제
소 스 코 드
#include <iostream>
typedef long long INT;
void Remain_Num(const INT&, int, const int&, INT&);
int main() {
std::ios_base::sync_with_stdio(false);
std::cin.tie(NULL);
std::cout.tie(NULL);
INT A;
int B, C;
std::cin >> A >> B >> C;
INT remain{ 1 };
Remain_Num(A, B, C, remain);
std::cout << remain;
return 0;
}
void Remain_Num(const INT& a, int b, const int& c, INT& r) {
INT temp{ a };
while (b != 0) {
if (b & 1) r = (r * temp) % c;
temp = (temp * temp) % c;
b >>= 1;
}
}
풀 이
더보기


나머지 계산시 반복되는 숫자를 통하여 구현하고 싶었지만, 너무 큰 수일 경우 너무 많은 수가 반복 되기 때문에, 틀렸다는 결과가 나왔다.
거듭제곱 성질과 나머지의 성질인 모듈로 연산의 성질과 증명을 찾아본 결과,
( A x B ) % C = ( A % C x B % C ) % C 라는 분배법칙의 성립을 알 수 있었습니다.
이를 통하여,
B가 짝수 일 경우,

B가 홀수 일 경우,

라는 공식을 통하여 결과를 찾을 수 있다.
출 력 값
문 제 출 처
문제 링크 : https://www.acmicpc.net/problem/1629
1629번: 곱셈
첫째 줄에 A, B, C가 빈 칸을 사이에 두고 순서대로 주어진다. A, B, C는 모두 2,147,483,647 이하의 자연수이다.
www.acmicpc.net
'[ ALGORITHM ] > [ 백 준 ]' 카테고리의 다른 글
[BAEKJOON] 2740번 : 행렬 곱셈 (0) | 2020.08.06 |
---|---|
[BAEKJOON] 11401번 : 이항 계수 3 (0) | 2020.08.05 |
[BAEKJOON] 1780번 : 종이의 개수 (0) | 2020.08.03 |
[BAEKJOON] 1992번 : 쿼드트리 (0) | 2020.08.02 |
[BAEKJOON] 2630번 : 색종이 만들기 (0) | 2020.08.01 |