코테 공부/백준
[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)