Deff_Dev
[백준] 1629번 곱셈 (C++) 본문
문제
자연수 A를 B번 곱한 수를 C로 나눈 나머지 값을 구하는 문제이다.
풀이
최대 연산 횟수는 약 21억이기 때문에, B번을 다 곱하면 시간 초과가 나온다.
그렇기 때문에 분할 정복을 이용해서 풀이해야한다.
예를들어서 입력이 2 8 5 일 때,
2를 8번 곱해서 256이 나오고 5를 나눈 나머지인 1이 출력될 것 이다.
2 * 2 * 2 * 2 * 2 * 2 * 2 * 2 = 256
하지만 이 연산에도 규칙이 있다.
(((2^2)^2)^2)처럼 제곱을 이용하면 8번해야하는 연산을 3번으로 줄일 수 있다.
왜 그럴까 ?
위 식을 계산해보면 아래와 같다.
2^2 = 4
4^2 = 16
16^2 = 256
이 규칙을 적용해서 문제를 풀어봤다.
#include <bits/stdc++.h>
using namespace std;
long long a, b, c;
long long Solve(long long a, long long b, long long c)
{
if(b == 0) return 1;
long long num = Solve(a, b / 2, c);
num = num * num % c;
if(b % 2 == 0) return num; // b가 짝수일 때
return num * a % c; // b가 홀수라면 a를 곱한다.
}
int main()
{
ios_base::sync_with_stdio(0);
cin.tie(0);
cin >> a >> b >> c;
cout << Solve(a,b,c);
return 0;
}
'코딩테스트 > 백준' 카테고리의 다른 글
[백준] 2206번 벽 부수고 이동하기 (C++) (0) | 2025.01.23 |
---|---|
[백준] 5427번 불 (C++) (0) | 2025.01.17 |
[백준] 7569번 토마토 (C++) (0) | 2025.01.16 |
[백준] 10026번 적록색약 (C++) (0) | 2025.01.16 |
[백준] 1926번 그림 (C++) (0) | 2025.01.14 |