PS/BOJ (Baekjoon Online Judge)

[BOJ_Silver 1] 1629 - 곱셈 [python]

까진호두 2022. 1. 13. 22:50

$A^{B} Mod C$의 값을 구하는 문제입니다.

A를 for문으로 B번만큼 곱하는 동시에 C로 나머지를 구해준다면 편하겠지만 

 

A, B, C는 모두 2,147,483,647 이하의 자연수이므로, 시간 초과가 발생합니다.

 

때문에, A^B의 값을 보다 빠르게 구하기 위해 아래의 함수를 사용할 필요가 있습니다.

 

def Func(A,B):

   if  B == 0:  return $1$

   elif  B % 2:  return $Func(A,B//2)^2 * A$

   return  $Func(A,B//2)^2$

 

간단한 예시를 들어, F(2,6)의 경우

1) Func(2,6)

2) Func(2,3)

3) Func(2,1)

4) Func(2,0)의 단계를 밟으며, $2^6$의 값을 총 4번의 함수 호출로 구할 수 있습니다.

 

한번 함수가 진행할때마다 차수가 2로 나누어지므로, 결과적으로,

다음의 함수는 O(logN + 1) = O(logN)의 시간 복잡도를 가집니다.

 

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


def getMod(A,B):
    if not B:
        return 1

    value = getMod(A, B // 2) ** 2

    if B % 2: value *= A % C

    return value % C

print(getMod(A,B))
728x90