기록

백준_1629_곱셈 본문

코딩테스트/python

백준_1629_곱셈

youngyin 2021. 1. 5. 18:30

문제

 

1629번: 곱셈

첫째 줄에 A, B, C가 빈 칸을 사이에 두고 순서대로 주어진다. A, B, C는 모두 2,147,483,647 이하의 자연수이다.

www.acmicpc.net

풀이

A, B가 커짐에 따라 A**B의 수행시간이 늘어난다. 따라서 이문제는 분할 정복을 이용하여 해결해야 한다. 모듈러 연산의 성질과 분할정복을 이용하면 B번의 연산을 log2B번으로 줄일 수 있다.

코드

def f(A, B) :
    if B==0 : return 1
    if B%2==0 :
        tmp1 = f(A, int(B / 2))
        ans = (tmp1 * tmp1) % C
    else :
        tmp1 = f(A, int(B / 2))
        tmp2 = (tmp1 * (A % C)) % C
        ans = (tmp1 * tmp2) % C
    return ans

A, B, C = map(int, input().split())
ans = f(A, B)
print(ans)

알고리즘

분할 정복 알고리즘: 문제를 작은 문제로 분할하여 문제를 해결하는 방법

 

분할 정복 알고리즘 - 위키백과, 우리 모두의 백과사전

위키백과, 우리 모두의 백과사전. 분할 정복 알고리즘(Divide and conquer algorithm)은 그대로 해결할 수 없는 문제를 작은 문제로 분할하여 문제를 해결하는 방법이나 알고리즘이다. 빠른 정렬이나 합

ko.wikipedia.org

 

'코딩테스트 > python' 카테고리의 다른 글

백준_1806_부분합  (0) 2021.01.15
백준_11660_구간 합 구하기 5  (0) 2021.01.06
백준_9465_스티커  (0) 2021.01.02
백준_12852_1로 만들기 2  (0) 2020.12.31
백준_2448_별 찍기 - 11  (0) 2020.12.30
Comments