문제 링크
1629번: 곱셈
첫째 줄에 A, B, C가 빈 칸을 사이에 두고 순서대로 주어진다. A, B, C는 모두 2,147,483,647 이하의 자연수이다.
www.acmicpc.net
풀이
- dp로 해결하려 했지만 메모리 초과
예 ) a = 2147483646, b = 2147483646 , c = 2147483647 처럼 숫자가 너무 큰 경우 해결 안됨
# 메모리 초과
a, b, c = map(int,input().split())
dp = [1] * (b+1)
for i in range(1,b+1):
dp[i] = (dp[i-1] * a) % c
print(dp[b])
- 다른 블로그를 참고하니 분할 정복 문제
- b가 짝수인지 홀수 인지 판단하여 분할 정복
예 ) b = 10 이라고 할 때
a ^ 10 -> (a ^ 5) ^2 꼴로 변경
a ^ 11 -> (a ^ 5)^ 2 * a 꼴로 변경
나머지 분해 법칙으로 구하기 위해서
: (AxB)%C = (A%C) *(B%C) % C
def power(a,b):
# b가 1이면 a를 c로 나눈 나머지 반환
if b == 1 :
return a % c
else :
# a ^ ( b//2 )
temp = power(a, b//2)
if b % 2 == 0:
return temp * temp % c
else:
return temp * temp * a % c
a, b, c = map(int,input().split())
print(power(a,b))
'개발 > algorithm' 카테고리의 다른 글
[백준 11660번] 구간 합 구하기 5 - python (0) | 2022.02.24 |
---|---|
[백준 1991번] 트리 순회 - python (0) | 2022.02.23 |
[백준 11725번] 트리의 부모 찾기 - python (0) | 2022.02.23 |
[백준 14500번] 테트로미노 - python (0) | 2022.02.19 |
[백준 16236번] 아기 상어 - python (0) | 2022.02.18 |