PS/BOJ
[백준] 1629.cpp : 곱셈
bconfiden2
2020. 7. 31. 12:37
1629번: 곱셈
첫째 줄에 A, B, C가 빈 칸을 사이에 두고 순서대로 주어진다. A, B, C는 모두 2,147,483,647 이하의 자연수이다.
www.acmicpc.net
- 모듈러 연산의 성질을 이해해야 한다.
- (A * B) % C == ((A % C) * (B % C)) % C
- 다만 B 의 범위가 21억까지이기 때문에, 전부 곱할 수는 없으므로 재귀를 통하여 반씩 나눠서 곱해준다.
- 연산 결과에 대한 자료형의 범위에 대해서도 주의할 것.
#include <iostream>
#define ull unsigned long long
#define pow(x) ((x) * (x))
ull a, b, c;
ull mod(ull s) // 분할 정복
{
if(s == 1) return a % c; // 1일 경우는 종료
else return ((pow(mod(s / 2) % c) % c) * (s % 2 == 0 ? 1 : (a % c))) % c;
} // 그 외에는 제곱수를 반으로 나눠서 곱해줌
// ex a^91 -> a^45 * a^45 * a
// ex a^80 -> a^40 * a^40
int main(void)
{
std::cin >> a >> b >> c;
std::cout << mod(b) << '\n';
}