알고리즘 연습/분할 정복

[🥈1 / 백준 1629 / 파이썬] 곱셈

김세진 2021. 7. 4. 20:51
반응형

 

 

1629번: 곱셈

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

www.acmicpc.net

 

문제

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

입력

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

출력

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

 

예제 입력

10 11 12

예제 출력

4

 

풀이

 

A를 B번 곱한 수를 C로 나눈 나머지를 출력하는 문제이다.

 

A, B, C는 모두 최대 2,147,483,647의 자연수가 입력될 수 있기 때문에

 

21억번을 직접 곱한다면 O(n)의 연산으로 시간초과가 나고 말 것이다.

 

이를 O(logN)으로 줄여주자.

 

만약 2^32 가 주어진다면

 

2^32 = 2^16 * 2^16

2^16 = 2^8 * 2^8

 

이렇게 분할 계산하여 값을 구한 뒤 불필요한 연산 횟수를 줄여주는 것이다.

 

이제 나머지에 유의하며 풀어주면 된다.

 

 

def dac(a,b,c):
    if b == 1:
        return a % c
    
    if b % 2 == 0:
        return (dac(a,b//2,c) ** 2)%c
    else:
        return ((dac(a,b//2,c) ** 2)*a)%c

a,b,c = map(int,input().split())
print(dac(a,b,c))
반응형