SMALL
1629번: 곱셈
첫째 줄에 A, B, C가 빈 칸을 사이에 두고 순서대로 주어진다. A, B, C는 모두 2,147,483,647 이하의 자연수이다.
www.acmicpc.net
분할정복을 이용한 거듭제곱 구하기인 줄 알았다.
나름 도전해보면서 DP 문제처럼 mem이라는 리스트도 사용해보았으나 실패한 흔적이다.
import sys
sys.stdin = open("sample.txt", "r")
A,B,C = map(int, sys.stdin.readline().split())
mem = dict()
mem[1] = A
def n_square(n, k):
if k not in list(mem.keys()):
mem[k // 2] = n_square(n, k // 2)
if k%2 == 0:
mem[k] = mem[k // 2] * mem[k // 2]
else:
mem[k] = mem[k // 2] * mem[k // 2] * mem[1]
return mem[k]
else:
return mem[k]
print(n_square(A, B)%C)
문제 풀이에 실패하고 구글링한 결과, 모듈로 연산은 다음과 같이 분배법칙이 성립한다.
이 문제에서는 마지막 줄의 곱셉에 주목해보면 구하고자 하는 값은 좌변에 있고 우리가 계산해야할 방식은 우변에 있다.

import sys
sys.stdin = open("sample.txt", "r")
A,B,C = map(int, sys.stdin.readline().split())
mem = dict()
mem[1] = A % C
def n_square(n, k):
if k not in list(mem.keys()):
mem[k // 2] = n_square(n, k // 2)
if k%2 == 0:
mem[k] = mem[k // 2] * mem[k // 2]
else:
mem[k] = mem[k // 2] * mem[k // 2] * mem[1]
return mem[k] % C
else:
return mem[k] % C
print(n_square(A, B)%C)'Coding Test > 백준 BOJ' 카테고리의 다른 글
| 백준 21610. 마법사 상어와 비바라기 - 골드 5 (0) | 2021.10.15 |
|---|---|
| 백준 11729. 하노이탑 - 실버 2 (0) | 2021.08.12 |
| 백준 10989 - 실버5 (0) | 2021.08.11 |
댓글