sw사관학교 정글 2기/02 이분탐색, 분할정복, 스택, 큐, 우선순위 큐

[분할정복] 백준 1629번 곱셈 with Python3 ★★

금의야행 2021. 8. 14. 13:35

https://www.acmicpc.net/problem/1629

 

1629번: 곱셈

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

www.acmicpc.net

 

정답 풀이

a, b, c = map(int, input().split())

## a^b%c를 반환하는 함수
def solution(a, b):
    # 어떤 수든 재귀를 타면 b==1이 되게 된다.
    
    if b==1:
        return a%c
    ans = solution(a, b // 2) # 지수승 절반값의 %c한 값 호출
    
    if b%2==0: # 짝수
        return ans*ans%c
        
    else: # 홀수
        return ans*ans*(a%c)%c
        # 공식상으로는 ans*ans*(a%c)%c지만 ans*ans*a%c 랑 같다.
        # 나머지 연산 (a*b*c*d)%f 는 a,b,c,d를 각각 f로 나눈 나머지를 곱한뒤 f로 나눈 값이나, 몇개는 냅두고 몇개는 f로 나눈 나머지를 곱한 값을 f로 나눈값이나 같다.

print(solution(a,b))

출처: https://backtony.github.io/algorithm/2021/02/11/algorithm-boj-class4-7/

 

해석

자세한 설명은 링크에.

 

사실 완전히 이해하는데에는 실패했다..