본문 바로가기

IT/Python

[백준] 1629번 곱셈 [Python]

728x90

$A^{B} \,\%\, C \,=\, ?$

A, B, C 가 주어졌을 때 위 식의 답을 구하는 문제

 

 

더보기

문제

자연수 A를 B번 곱한 수를 알고 싶다. 단 구하려는 수가 매우 커질 수 있으므로 이를 C로 나눈 나머지를 구하는 프로그램을 작성하시오.

입력

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

출력

첫째 줄에 A를 B번 곱한 수를 C로 나눈 나머지를 출력한다.

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

 

분할 정복을 이용한 거듭 제곱

B가 2의 거듭제곱일 경우 재귀적으로 A의 제곱을 반복해서 너무 큰 지수 연산을 피한다.

B가 홀수 일때, $($B-1$)$의 절반에 대해서 위의 과정이 가능한지 확인한다. 

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

def f(a, b):
    if b == 1:
        return a
    elif b%2:
        x = f(a, (b-1)//2)
        return x*x*a%C
    else:
        x = f(a, b//2)
        return x*x%C

print(f(A%C, B))

 

pow함수를 사용하면 

pow(base, exp, mod) = $(base ^ exp) % mod$의 값을 리턴해줍니다.

print(pow(*map(int, input().split())))

 

더보기
((A%C)**B)%C >>> 시간 초과

 

더보기

예제 입력 1 

10 11 12

예제 출력 1 

4