반응형
문제
자연수 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))
반응형
'알고리즘 연습 > 분할 정복' 카테고리의 다른 글
[🥉1 / 백준 2740 / 파이썬] 행렬 곱셈 (0) | 2021.07.06 |
---|---|
[🥇1 / 백준 11401 / 파이썬] 이항 계수 3 (0) | 2021.07.05 |
[🥈2 / 백준 1780 / 파이썬] 종이의 개수 (0) | 2021.07.04 |
[🥈1 / 백준 1992 / 파이썬] 쿼드트리 (0) | 2021.07.04 |
[🥈3 / 백준 2630 / 파이썬] 색종이 만들기 (쿼드 트리) (0) | 2021.07.03 |