Notice
Recent Posts
«   2024/11   »
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
Archives
관리 메뉴

교대최소제곱법

[백준 파이썬 1629번 곱셈] 분할 정복 본문

코딩테스트

[백준 파이썬 1629번 곱셈] 분할 정복

옐라크레 2023. 9. 12. 23:41

지수 법칙

A^m+n = A^m x A^n

나머지 분배 법칙

(AxB)%C = (A%C) *(B%C) % C

 

예제 문제

https://www.acmicpc.net/problem/1629

 

1629번: 곱셈

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

www.acmicpc.net

분할 정복

→ 11 이면 5, 6으로 스플릿

→ 6 이면 3, 3으로 스플릿해서 계산한다

 

ex)

a = 10 , b = 11 , c = 12

10^11 % 12

= ((10^5)%12 x (10^5)%12 x 10)% 12

= (((10^2)%12 x (10^2)%12 x 10) %12 x ((10^2)%12 x (10^2)%12 x 10) %12 x 10) %12

 

11 -> 5 -> 2 -> 1 분할 정복

import sys

A, B, C = map(int, sys.stdin.readline().split())

def cal(a, b):
    if b == 1:
        return a % C
    else:
        tmp = cal(a, b//2)
        if b % 2 == 0:
            return (tmp * tmp) % C
        else:
            return (tmp * tmp * A) % C

print(cal(A, B))

 

+ int max = 2,147,483,647