ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [백준 1629] 곱셈 python (수학)
    study/PS 2021. 2. 4. 22:49

     

    자연수 A를 B번 곱한수를 만들고 이를 C로 나눈값을 출력하면 된다.

    A ** B % C 하면 될 것 같지만 시간 복잡도 O(B)이기 때문에 시간 초과한다... 매우 크게..

    이때 이진수를 활용하면 빠르게 풀이 할 수 있다.

    아이디어 : 거듭제곱은 거듭제곱 간의 곱으로 표현 가능하다.

    A^13이라는 값을 이진수로 표현하면 A^1101이 되는데 

    1101  / 2 => 110 ... 1
    110   / 2 => 11   ... 0
    11     / 2 => 1     ... 1
    1      / 2 => 0    ... 1

    이렇게 2로 나누면 나머지가 원래 가지고 있던 이진수가 됨을 알 수 있다.

    A^13 = A * A^4 * A^8

    조건문 + N진수 변환 방법으로 해결 가능하다는 것을 알 수 있다.

    def answer(a, b):
    	ret = 1
    	while b:
    		if b % 2 == 1:
    			ret *= a
    		a = a * a
    		b //= 2
    	return ret
    

    여기서 입출력과 c를 더해주면 된다.

    def answer(a, b, mod):
    	ret = 1
    	while b:
    		if b % 2 == 1:
    			ret = ret * a % mod
    		a = a * a % mod
    		b //= 2
    	return ret
    
    a, b, c = map(int, input().split())
    print(answer(a,b,c))
    

     

    'study > PS' 카테고리의 다른 글

    [백준 1309] 동물원 C++ (DP, 다차원)  (0) 2020.02.21
    [백준 1012] 유기농 배추 C++ (bfs, dfs)  (0) 2020.02.10

    댓글

Designed by Tistory.