반응형
https://www.acmicpc.net/problem/1629
1629번: 곱셈
첫째 줄에 A, B, C가 빈 칸을 사이에 두고 순서대로 주어진다. A, B, C는 모두 2,147,483,647 이하의 자연수이다.
www.acmicpc.net
[ 문제풀이 ]
가장 기본적인 분할 정복 문제입니다. 제곱수의 값이 짝수이면 제곱수를 반으로 나누어 서로 곱하는 방식으로 진행하여 시간 복잡도를 O(logN)으로 줄일 수 있습니다. 시간을 더 단축하기 위해서 메모제이션을 해주어야 문제를 풀 수 있습니다.
[ 소스 코드 ]
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 | #include<iostream> #include<unordered_map> #define ll long long using namespace std; ll A, B, C; unordered_map<ll, ll> m; ll conquer(ll num) { if (num == 0) return 1; if (num == 1) return A % C; if (m[num] != 0) return m[num] % C; if (num % 2 == 0) { m[num] = conquer(num / 2) * conquer(num / 2); return m[num] % C; } else { m[num] = conquer(num - 1) * A; return m[num] % C; } } int main() { scanf("%lld %lld %lld", &A, &B, &C); printf("%lld", conquer(B) % C); } | cs |
반응형
'백준' 카테고리의 다른 글
[ 백준 ] 1725번 - 히스토그램 (C++) (0) | 2022.08.03 |
---|---|
[ 백준 ] 6549번 - 히스토그램에서 가장 큰 직사각형 (C++) (0) | 2022.08.02 |
[ 백준 ] 11725번 - 트리의 부모 찾기 (C++) (0) | 2022.07.31 |
[ 백준 ] 11444번 - 피보나치 수 6 (C++) (0) | 2022.07.30 |
[ 백준 ] 2243번 - 사탕상자 (C++) (0) | 2022.07.29 |