www.acmicpc.net/problem/1629

 

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';
}

'PS > BOJ' 카테고리의 다른 글

[백준] 1991.cpp : 트리 순회  (0) 2020.08.04
[백준] 1932.cpp : 정수 삼각형  (0) 2020.08.03
[백준] 1149.cpp : RGB거리  (0) 2020.07.30
[백준] 15663.cpp : N과 M (9)  (0) 2020.07.29
[백준] 11725.cpp : 트리의 부모 찾기  (0) 2020.07.28

+ Recent posts