[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))
'DevLog ๐จ > Baekjoon' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[DevLog][Baekjoon] 8983: ์ฌ๋ฅ๊พผ (0) | 2023.08.16 |
---|---|
[DevLog][Baekjoon] 2110: ๊ณต์ ๊ธฐ ์ค์น (0) | 2023.08.16 |
[DevLog][Baekjoon] 2261: ๊ฐ์ฅ ๊ฐ๊น์ด ๋ ์ (0) | 2023.08.14 |
[BaekJoon] 1007: ๋ฒกํฐ ๋งค์นญ (0) | 2023.02.16 |
[BaekJoon] 1005: ACM Craft (0) | 2023.02.14 |