Programming/Python

[Python3] 1629 곱셈 - 백준(실버1) - 분할정복 (재귀 없이 풀기)

아나엘 2023. 8. 7. 18:12
시간 제한메모리 제한제출정답맞힌 사람정답 비율
0.5 초 (추가 시간 없음)  128 MB 100688 27852 20334 26.725%

문제

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

입력

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

출력

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

예제 입력 1 

10 11 12

예제 출력 1 

4

출처

  • 문제를 만든 사람: author5

알고리즘 분류

 

문제 - 1 페이지

 

www.acmicpc.net

 

코드

import sys
#런타임 에러는 앞에 이걸 추가해주는 방식으로 재귀 깊이를 변경해 줘야함.
#재귀함수를 이용한 분할정복
#sys.setrecursionlimit(100000) #이 문제에서 log(b)는 최대 30정도..


def power(a, b, c):
    #왠지 모르겠지만 recursion error가 남. 바킹독 따라 했는데 왜?
#    if b==1: 
#        return a % c #b=1일 때
#    val = power(a, b/2, c) #재귀. 일단 b를 절반씩 줄여서 2까지 파고든다.
#    val = val * val % c #power의 return값 이용
#    if(b%2==0):
#        return val #짝수일 때. 맨처음에 실행되는 값은 그러면 (a%c * a%c) % c
#    return val * a % c #b가 홀수일 때. 3부터. val대신 3을 쓰는 이유는? 저위에 계산한거에 a 한번만 곱해주면 됨
  
    #recursion 대신 while로.
    val=1
    while b>0:
        if b % 2 != 0: #홀수
            val = (val * a) % c
        b //= 2
        a = (a * a) % c #짝수
    return val
        
        


a, b, c = map(int, sys.stdin.readline().split())
print(power(a,b,c))

 

고민거리

바킹독 자료(https://baaaaaaaaaaaaaaaaaaaaaaarkingdog.tistory.com/943 ; 재귀)를 보다가 c++코드를 파이썬으로 바꿨는데 recursion error 가 자꾸 났다. 파이썬 재귀 깊이 제한때문이라고 생각을 해서 sys.setrecursionlimit() 으로 바꿔줬는데도 똑같이 에러가 나서 아예 재귀를 빼버렸다. ..

KING받음

반응형