Programming/백준
[실버 1] 백준 1629 - 곱셈 (파이썬)
pental
2025. 7. 5. 13:25
https://www.acmicpc.net/problem/1629
풀이
- A^B % C를 직접 계산하면 시간 복잡도 O(B), 너무 크다.
- A^B = A^(B//2) * A^(B//2) (짝수일 경우)
- A^B = A^(B//2) * A^(B//2) * A (홀수일 경우)
- 이를 이용해서 재귀적으로 절반씩 계산하면서 나머지를 구하는 방식을 사용한다. → 시간복잡도 O(log B)
def power(a, b, c):
if b == 0:
return 1 # a^0 = 1
if b == 1:
return a % c # a^1 % c = a % c
x = power(a, b // 2, c) # A^(B//2) 값을 재귀 호출로 구함
if b % 2 == 0:
return (x * x) % c # A^B = x^2 if B is even
else:
return (x * x * a) % c # A^B = x^2 * a if B is odd
- 재귀적으로 power(a, b // 2, c) 를 호출함으로써 log₂(b) 번만 연산한다.
- 각 단계마다 곱셈을 하고 나머지 연산 % c 를 하기 때문에 숫자가 커져도 오버플로우 없이 처리 가능하다.
코드
# 백준 1629 - 곱셈
# 분류 : 다이나믹 프로그래밍
A, B, C = map(int, input().split())
def power(a, b, c):
if b == 0:
return 1
if b == 1:
return a % c
x = power(a, b // 2, c)
if b % 2 == 0:
return (x * x) % c
else:
return (x * x * a) % c
print(power(A, B, C))