코테 공부/백준

[Python/분할정복] 1629 곱셈

prefer_all 2022. 9. 20. 09:14

문제

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

 

입력

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

 

출력

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

예제 입력 예제 출력
10 11 12 4

풀이
# *** 오답: 시간 초과
a, b, c = map(int, input().split())
answer = (a ** b) % c
print(answer)

 

곱셈의 개수를 줄이는 분할 정복이 필요하다

1. B의 값이 홀수인지 짝수인지 파악
2. B 값이 짝수: 10^10 => (10^5)^2 형태로 바꿔줌
    B 값이 홀수: 10^11 => (10^5)^2 * 10의 형태로 바꿔줌
def find(a,b):
    if b == 1:
        return a%c
    else:
        temp = find(a, b//2)
        if b%2 == 0: # b가 짝수 일 때
            return (temp*temp)%c
        else:
            return (temp*temp*a)%c

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