반응형
링크
https://www.acmicpc.net/problem/1629
문제
자연수 A를 B번 곱한 수를 알고 싶다. 단 구하려는 수가 매우 커질 수 있으므로 이를 C로 나눈 나머지를 구하는 프로그램을 작성하시오.
입력
첫째 줄에 A, B, C가 빈 칸을 사이에 두고 순서대로 주어진다. A, B, C는 모두 2,147,483,647 이하의 자연수이다.
출력
첫째 줄에 A를 B번 곱한 수를 C로 나눈 나머지를 출력한다.
예제 입력 1
10 11 12
예제 출력 1
4
아이디어 스케치
분할 정복 알고리즘을 사용하지 않을 경우 시간 초과가 발생한다.
분할 정복 알고리즘을 사용하여 거듭제곱을 계산하기 위해서는 다음과 같은 아이디어가 필요하다.
\(C^n\)은 위 식과 같이 분할할 수 있다.
즉 n이 1일 때는 자기 자신을 return하고, n이 짝수일 때는 두 번째 식을 return하고, n이 홀수일 때는 세 번째 식을 return하는 재귀함수를 구현하면 된다.
전체 코드
#include <stdio.h>
#define lld long long
int divide_pow(int a, int b, int c);
int main()
{
int A, B, C;
scanf("%d %d %d", &A, &B, &C);
printf("%lld", divide_pow(A % C, B, C));
return 0;
}
int divide_pow(int a, int b, int c) {
lld tmp;
if (b == 1) // 어떤 수의 1제곱은 자기 자신
return a;
else {
tmp = divide_pow(a, b / 2, c);
if (b % 2 == 0)
return (tmp * tmp)%c;
else
return ((tmp * tmp)%c * a) % c;
}
}
제출 결과
반응형
LIST
'백준' 카테고리의 다른 글
[C++] 백준 1927번 최소 힙 (0) | 2025.03.07 |
---|---|
[C언어] 백준 12865번 평범한 배낭 (0) | 2025.03.07 |
[C언어] 백준 11051번 이항 계수 2 (0) | 2025.03.07 |
[C언어] 백준 2156번 포도주 시식 (0) | 2025.03.07 |
[C언어] 백준 10844번 쉬운 계단 수 (0) | 2025.03.07 |