티스토리 뷰

Algorithm/BOJ

백준 1629번 C++

poopooreum 2023. 7. 24. 19:22
반응형

백준 1629번 곱셈
https://www.acmicpc.net/problem/1629

1629번: 곱셈

첫째 줄에 A, B, C가 빈 칸을 사이에 두고 순서대로 주어진다. A, B, C는 모두 2,147,483,647 이하의 자연수이다.

www.acmicpc.net



정답 코드

#include<iostream>
using namespace std;
long long int pow(long long a, long long b, long long m) {
	if (b == 1)
		return a % m;
	long long val = pow(a, b / 2, m);
	val = val * val % m;
	if (b % 2 == 0)
		return val;
	return val * a % m;

}
int main() {
	ios_base::sync_with_stdio(false);
	cin.tie(0);
	cout.tie(0);
	long long int a, b, c;
	cin >> a >> b >> c;
	cout << pow(a, b, c);
	
}



문제 풀이

수학력을 요구하는 문제이면서 재귀를 이용하여 푸는 문제입니다. int형을 사용하면 오버플로우가 발생할 수 있기 때문에 long long int형을 사용하였습니다.
또한 b가 최대21억인 경우 시간초과가 나기 때문에 O(n)보다 낮은 시간복잡도를 사용해야 합니다.

먼저 b가 1인 경우, 바로 a를 m으로 나눈 나머지를 출력할 수 있도록 하였습니다. 그리고 다음 줄에
long long val = pow(a, b / 2, m);

그 다음 b가 짝수일 때와 홀수일 때를 나누어서 풀어야 합니다. b가 짝수일 경우에는 그냥 val값을 반환하면 되지만 b가 홀수일 경우에는 a를 한 번 더 곱해서 반환해야 합니다. 이렇게 풀 경우 시간복잡도는 O(logb)입니다.

반응형

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

백준 1676번 C++  (0) 2023.07.25
[C/C++] 백준 1644번 - 소수의 연속합  (0) 2023.07.25
백준 1620번 C++  (0) 2023.07.24
백준 1600번 C++  (0) 2023.07.24
백준 1550번 C++  (0) 2023.07.24
반응형
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/01   »
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
글 보관함