DevLog ๐Ÿ“จ/Baekjoon

[DevLog][Baekjoon] 1629: ๊ณฑ์…ˆ

cece00 2023. 8. 14. 11:28

[1629] ๊ณฑ์…ˆ

1) ๋ฌธ์ œ

์ž์—ฐ์ˆ˜ A๋ฅผ B๋ฒˆ ๊ณฑํ•œ ์ˆ˜๋ฅผ ์•Œ๊ณ  ์‹ถ๋‹ค. ๋‹จ ๊ตฌํ•˜๋ ค๋Š” ์ˆ˜๊ฐ€ ๋งค์šฐ ์ปค์งˆ ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ์ด๋ฅผ C๋กœ ๋‚˜๋ˆˆ ๋‚˜๋จธ์ง€๋ฅผ ๊ตฌํ•˜๋Š” ํ”„๋กœ๊ทธ๋žจ์„ ์ž‘์„ฑํ•˜์‹œ์˜ค.

์ฒซ์งธ ์ค„์— A, B, C๊ฐ€ ๋นˆ ์นธ์„ ์‚ฌ์ด์— ๋‘๊ณ  ์ˆœ์„œ๋Œ€๋กœ ์ฃผ์–ด์ง„๋‹ค. A, B, C๋Š” ๋ชจ๋‘ 2,147,483,647 ์ดํ•˜์˜ ์ž์—ฐ์ˆ˜์ด๋‹ค. ์ฒซ์งธ ์ค„์— A๋ฅผ B๋ฒˆ ๊ณฑํ•œ ์ˆ˜๋ฅผ C๋กœ ๋‚˜๋ˆˆ ๋‚˜๋จธ์ง€๋ฅผ ์ถœ๋ ฅํ•œ๋‹ค.

์˜ˆ์ œ ์ž…/์ถœ๋ ฅ

10 11 12
# output is 4

2) ํ’€์ด

$\ A^(x+y) = A^x \times A^y$ ์ž„์„ ์ด์šฉํ•ด ๋ถ„ํ•  ์ •๋ณต์œผ๋กœ ํ’€์–ด์•ผ๊ฒ ๋‹ค๋Š” ์ƒ๊ฐ์€ ๋“ค์—ˆ๋Š”๋ฐ, ๊ตฌ์ฒด์ ์ธ ๊ตฌํ˜„๋ฐฉ๋ฒ•์ด ๋– ์˜ค๋ฅด์ง€ ์•Š์•˜๋‹ค. ๊ฒฐ๊ตญ ํ’€์ด๋ฅผ ์ฐธ๊ณ ํ–ˆ๊ณ , ํ•ต์‹ฌ์€ ๋ชจ๋“ˆ๋Ÿฌ ์—ฐ์‚ฐ์˜ ์„ฑ์งˆ์ด๋ผ๋Š” ์ ์„ ์•Œ๊ฒŒ ๋˜์—ˆ๋‹ค.

๋ชจ๋“ˆ๋Ÿฌ ์—ฐ์‚ฐ์˜ ๋ถ„๋ฐฐ๋ฒ•์น™

$(A \pm B), \bmod, C = [(A,\bmod,C)\pm(B,\bmod,C),\bmod C] $
$(A \times B), \bmod, C = [(A,\bmod,C)\times(B,\bmod,C),\bmod C] $

์ ‘๊ทผ๋ฒ•

A์˜ ์ง€์ˆ˜์ธ B๋ฅผ 2๋กœ ๋‚˜๋ˆ„์–ด๊ฐ€๋ฉด์„œ mod C ๋ฅผ ์ˆ˜ํ–‰ํ•˜๊ณ , ์ง์ˆ˜/ํ™€์ˆ˜ ์—ฌ๋ถ€์— ๋”ฐ๋ผ ์—ฐ์‚ฐ๋œ ๊ฐ’์„ ๋ชจ๋‘ ๊ณฑํ•˜์—ฌ ๋‹ค์‹œ mod C ํ•˜๋Š” ๊ณผ์ •์„ ์žฌ๊ท€์ ์œผ๋กœ ์ˆ˜ํ–‰ํ•œ๋‹ค.

# pseudo code
# A^B % C ๋ฅผ ์—ฐ์‚ฐํ•˜๋ผ

modulo(A, N):
  IF N == 1:
    return A % C

  K = modulo(A, N//2)
  IF N is odd:
    return A * K * K % C
  ELSE:
    return K * K % C
# example
A = 3, B = 6, C = 2 ์ด๋ฉด

modulo(3, 6)
    modulo(3, 3)
        modulo(1, 3)
        ๋ฆฌํ„ด 3 % 2 = 1
    3์ด ํ™€์ˆ˜์ด๋ฏ€๋กœ
    ๋ฆฌํ„ด 3 * 1 * 1 % 2 = 1 # (A * (A mod C) * (A mod C)) mod C
6์ด ์ง์ˆ˜์ด๋ฏ€๋กœ
๋ฆฌํ„ด 1 * 1 % 2 = 1

์ฒ˜์Œ์—๋Š” B๋ฅผ ๋‘ ์ˆ˜์˜ ํ•ฉ์œผ๋กœ ๋‚˜๋ˆ„์–ด ๊ฐ๊ฐ ์žฌ๊ท€ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•˜๋Š” ์ฝ”๋“œ๋กœ ์ƒ๊ฐํ–ˆ๋Š”๋ฐ, ํ•œ ๋ฒˆ๋งŒ ํ˜ธ์ถœํ•ด tmp ๋ณ€์ˆ˜์— ๋„ฃ์–ด ๋‘๊ณ  ์ง/ํ™€ ์—ฌ๋ถ€์— ๋”ฐ๋ผ ๊ฐ’์„ ๋ฆฌํ„ดํ•ด์ค˜๋„ ์ถฉ๋ถ„ํ•˜๋‹ค๋Š” ๊ฒƒ์„ ์•Œ๊ฒŒ ๋˜์—ˆ๋‹ค. ์˜ค๋žœ ์‹œ๊ฐ„ ๊ณ ๋ฏผํ–ˆ์ง€๋งŒ ๊ฒฐ๊ตญ ํ’€์ง€ ๋ชปํ•ด ์•„์‰ฌ์›€์ด ๋‚จ๋Š”๋‹ค๐Ÿฅฒ ํ’€์ด๋ฅผ ๋ณด๊ณ  ์ดํ•ดํ•˜๋Š” ๊ณผ์ •์ด ๋‹ค์Œ ์Šคํ…์—์„œ ๋˜ ๋„์›€์ด ๋˜๊ฒ ์ง€, ํ•˜๋Š” ๋ฐ”๋žจ

03) ์ฝ”๋“œ (ํŒŒ์ด์ฌ)

import sys
sys.setrecursionlimit(10**8)

A, B, C = list(map(int, input().split()))


def modulo(n):
    if n == 1:
        return (A % C)

    tmp = modulo(n//2)
    if n % 2 == 0:
        return tmp * tmp % C
    return A * tmp * tmp % C


print(modulo(B))