Algorithm/BaekJoon
(파이썬) 백준 1629번 "곱셈"
innit
2022. 5. 23. 19:16
# 문제상황
A, B, C = map(int, input().split())
def R(B):
global A, C
ans = 0
if B == 1:
ans = A
elif B % 2 == 1:
ans = R(B // 2) ** 2 * A
elif B % 2 == 0:
ans = R(B // 2) ** 2
return ans % C
print(R(B) % C)
# 풀이과정
어떤 수 A를 20억번 곱해야한다고 가정해봅시다.
무식하게 A를 정말 20억번 다 곱하고 있으면 시간이 오래 걸립니다.
생각해봅시다.
(A의 20억승)은 (A의 10억승)을 2번 곱한 것과 같습니다.
즉 A를 20억번 곱할 필요 없이, A를 10억번만 곱하고 그 결과를 제곱하면 연산횟수가 절반으로 줄어듭니다.
다른 예시를 생각해봅시다.
(A의 101승)은 어떻게 빨리 구할 수 있을까요?
(A의 50승)을 제곱해주고 거기에 A를 1번만 더 곱해주면 됩니다.
결론. (A의 B승)을 빨리 구하는 법
1) B가 짝수일 때 → (A의 B승) == ((A의 B // 2승)의 2승)
2) B가 홀수일 때 → (A의 B승) == ((A의 B // 2승)의 2승) * A
728x90
반응형