[Baekjoon/๐ฅSilverโ ] 1629: ๊ณฑ์ โญ
๐โโ๏ธ ๊ณฑ์
์์ฐ์ A๋ฅผ B๋ฒ ๊ณฑํ ์๋ฅผ ์๊ณ ์ถ๋ค. ๋จ ๊ตฌํ๋ ค๋ ์๊ฐ ๋งค์ฐ ์ปค์ง ์ ์์ผ๋ฏ๋ก ์ด๋ฅผ C๋ก ๋๋ ๋๋จธ์ง๋ฅผ ๊ตฌํ๋ ํ๋ก๊ทธ๋จ์ ์์ฑํ์์ค.
๐โโ๏ธ ์ ๋ ฅ
์ฒซ์งธ ์ค์ A, B, C๊ฐ ๋น ์นธ์ ์ฌ์ด์ ๋๊ณ ์์๋๋ก ์ฃผ์ด์ง๋ค. A, B, C๋ ๋ชจ๋ 2,147,483,647 ์ดํ์ ์์ฐ์์ด๋ค.
๐โโ๏ธ ์ถ๋ ฅ
์ฒซ์งธ ์ค์ A๋ฅผ B๋ฒ ๊ณฑํ ์๋ฅผ C๋ก ๋๋ ๋๋จธ์ง๋ฅผ ์ถ๋ ฅํ๋ค.
๐ฉโ๐ป Algoritm: ๋จ์ ์ ๊ณฑ ์ฐ์ฐ
๋ฌธ์ ๋ง ๋ณธ๋ค๋ฉด ์ ๋ง ๊ฐ๋จํ๊ฒ ํด๊ฒฐํ ์ ์๋ ๋ฌธ์ ์ด๋ค. ์ง์ ๋ฐ๋ณต๋ฌธ์ด๋ ์ฌ๊ท๋ฅผ ํตํด A๋ฅผ B๋ฒ ๊ณฑํ๋ฉด ๋๊ธฐ ๋๋ฌธ์ด๋ค.
ํ์ง๋ง ํด๋น ๋ฌธ์ ๋ ์๊ฐ ์ ํ์ด 0.5์ด๋ก ์กด์ฌํ๋ค. ๋ฐ๋ผ์ A, B, C ๋ชจ๋ 2,147,483,647 ์ดํ์ ์์ฐ์๊ฐ ๋ ์ ์๊ธฐ ๋๋ฌธ์ ๋ฐ๋ณต๋ฌธ์ด๋ ์ฌ๊ท๋ฅผ ํตํด ํด๊ฒฐํ๋ค๋ฉด ์ ํ ์๊ฐ ๋ด์ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ ์ ์๋ค.
a, b, c = map(int, input().split())
print((a**b)%c)
๐ฉโ๐ป Algorithm: ๋ฐ๋ณต๋ฌธ, ์ฌ๊ท๋ฅผ ํตํ logN ํ์ด
A๋ฅผ B๋ฒ ๊ณฑํ๋ ํ์ด๋ ์๊ฐ๋ณต์ก๋๊ฐ O(N)์ด๋ค.
๋ฐ๋ณต๋ฌธ์ ๋ฐ๋ณต๋ฌธ์ ํตํด O(logN) ์๊ฐ๋ณต์ก๋์ ์ฝ๋๋ฅผ ์์ฑํ ์ ์๋ค.
์ฐ์ ๋ฐ๋ณต๋ฌธ์ ํตํ O(logN)์ ํ์ด๋ฅผ ํ์ธํด๋ณด์!
โจ๏ธ ๋ฐ๋ณต๋ฌธ: O(logN)
#๋ฐ๋ณต
def power(a, b):
ans = 1
while b > 0:
if b % 2 != 0:
ans *= a
a *= a
b //= 2
a, b, c = map(int, input().split())
print(power(a, b))
โจ๏ธ ์ฌ๊ท: O(logN)
๊ทธ๋ ๋ค๋ฉด ์ด๋ฒ์๋ ์ฌ๊ท๋ฅผ ํตํ O(logN)์ ํ์ด๋ฅผ ํ์ธํด๋ณด์!
#์ฌ๊ท
def power():
if b == 1:
return a
tmp = power(a, b//2)
if b %2:
return a*tmp*tmp
else:
return tmp*tmp
a, b, c= map(int, input().split())
print(power())
- ๋ฐ๋ณต๋๋ ์ฐ์ฐ๊ฐ์ tmp์ ๋ฏธ๋ฆฌ ์ ์ฅํด ์ฌ์ฉํ์ฌ ์ฐ์ฐ์ ์๋ฅผ ์ค์ธ๋ค.
- ํด๋น ์ฝ๋๋ ๋ฌธ์ ๋ฅผ ๋ถ๋ถ ๋ฌธ์ ๋ก ์ชผ๊ฐ ํ, ๋ถ๋ถ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ ๊ฒฐ๊ณผ๋ฅผ ์กฐํฉํด ์ต์ข
๊ฒฐ๊ณผ๋ฅผ ์ป๋
โญ๋ถํ ์ ๋ณตโญ
๊ธฐ๋ฒ์ด ์ ์ฉ๋์๋ค!
ํ์ง๋ง ์๊ฐ๋ณต์ก๋๊ฐ O(logN)์ธ ๋ฌธ์ ํ์ด์์๋ ์๊ฐ์ด๊ณผ๊ฐ ๋ฐ์ํ๋ค.๐ ๊ทธ๋ ๋ค๋ฉด ์ด๋ป๊ฒ ์คํ ์๋๋ฅผ ๋ ๋์ผ ์ ์์๊น??
๐โโ๏ธ ํ์ด์ฌ์์์ ๊ณฑ์ : ํผ์ฐ์ฐ์์ ํฌ๊ธฐ๋ฅผ ์ค์ด์!
ํ์ด์ฌ ํผ์ฐ์ฐ์์ ํฌ๊ธฐ๊ฐ ๊ณฑ์ ์๋์ ๋ฏธ์น๋ ์ํฅ์ ํด๋น ๊ฒ์๊ธ์ ํตํด์ ํ์ธํ ์ ์๋ค.
์ฆ, ํ์ด์ฌ์์๋ ๊ณฑ์ ์ ํผ์ฐ์ฐ์์ ํฌ๊ธฐ๊ฐ ํด์๋ก 2์ง์ ์๋ฆฟ์๊ฐ ๋์ด๋๊ฒ ๋๊ณ ๊ทธ์ ๋ฐ๋ผ ๊ณฑ์ ์ ์ฐ์ฐ ์๋๊ฐ ๋๋ ค์ง๊ฒ ๋๋ค.
๊ทธ๋ ๋ค๋ฉด ์ด๋ฅผ ์ ์ฉํด ์ ์ฝ๋๋ฅผ ๋ฆฌํฉํ ๋งํด๋ณด์! ๋ฌธ์ ์์๋ ๊ฒฐ๊ณผ๊ฐ์ด ์ปค์ง๋ ๊ฒ์ ๋๋นํด C๋ก ๋๋ ๋๋จธ์ง๋ฅผ ์ถ๋ ฅํ๊ฒ ๋๋ค. ๋ฐ๋ผ์ ์ฐ๋ฆฌ๋ ๊ณฑ์ ์์์ ํผ์ฐ์ฌ์ ํฌ๊ธฐ๋ฅผ ์ค์ด๊ธฐ ์ํด ๊ฐ ๋จ๊ณ์์ C๋ก ๋๋ ๋๋จธ์ง๋ฅผ ํ์ฉํ ์ ์๋ค.
def power(a, b):
if b == 1:
return a%c
tmp = power(a, b//2)
while b > 0:
if b%2:
return (a*tmp*tmp)%c
else:
return (tmp*tmp)%c
a, b, c = map(int, input().split())
print(power(a, b))
๋๊ธ๋จ๊ธฐ๊ธฐ