๐ ๋ฌธ์
๐ง ์์ด๋์ด
$$ A^B % C $$
1. ์๊ฐ ๋ณต์ก๋
A๋ฅผ ๊ทธ๋๋ก B ๋ฒ ๊ณฑํ๋ฉด O(AB) ์๊ฐ์ด ๊ฑธ๋ฆฌ๊ณ A ์ B๊ฐ ๋ชจ๋ Int ์ต๋์ผ๋ 2^64์ ๊ฐ๊น์ด ์๊ฐ๋ณต์ก๋๋ฅผ ๊ฐ๊ฒ๋๋ค.
์ด๋ป๊ฒ ํ๋ฉด
์๊ฐ ๋ณต์ก๋๋ฅผ ๋ฎ์ถ ์ ์์๊น?
$$ O (Log B) $$
๋ก ํด๊ฒฐํ ์ ์๊ฒ๋์๋ค.
์ด ๋, ์ฃผ์ํด์ผ ํ ๊ฒ์ด ์ง์์น์ด '์ง์'๋ 'ํ์'๋์ ๋ฐ๋ผ ๋ถ๊ธฐ๋์ด์ผ ํ๋ค๋ ๊ฒ์ด๋ค.
์๋ฅผ ๋ค๋ฉด
A^6 % c == (A^3 % c * A^3 %c) %c
์ง๋ง
A^7 % c == (A^3 % c * A^3 %c A^1 % c) %c ๋ก ๋๋์ด์ผํ๋ค.
/2 ์ฐ์ฐ์ ํ ๋ ํผ์ ์๊ฐ ํ์์ธ ๊ฒฝ์ฐ ๋๋จธ์ง 1์ด ๋ฒ๋ ค์ง๊ธฐ ๋๋ฌธ์ด๋ค.
2. ์๋ฃํ
Int ์๋ฃํ์ 4๋ฐ์ดํธ๋ก
$$ ~ 2^{32} - 1 $$
Long ์๋ฃํ์ด 8๋ฐ์ดํธ๋ก
$$ ~ 2^{64} - 1 $$ ์ ์์ ๋ฒ์๋ฅผ ๊ฐ๋๋ค๋ ๊ฒ์ ๊ธฐ์ตํด์ผํ๋ค.
3. Modular ์ฑ์ง
์ฌ๊ธฐ์์ ํต์ฌ์ ๋ชจ๋๋ก ์ฐ์ฐ์ ๋ํ ์ฑ์ง์ ๋ฏธ๋ฆฌ ์๊ณ ์์ด์ผ ํ๋ค.
์ด ๋ด์ฉ์ ๋ํด์๋ ์๋ ๋งํฌ๋ฅผ ์ฐธ์กฐํ๋ฉด ๋๊ฒ ๋ค.
๐ Kotlin Code
import java.io.BufferedReader
import java.io.InputStreamReader
// ๋ชจ๋๋ฌ ์ฑ์ง : (a * b) % c = (a % c * b % c) % c
private fun getAB(A: Long, B: Long, C: Long) : Long {
// Base Condition
if (B == 1L) return A % C
val nextNum = getAB(A, B / 2, C)
// ์ง์๊ฐ ์ง์์ผ ๋
return if (B % 2 == 0L) nextNum * nextNum % C
// ๊ฒฐํฉ ๋ฒ์น์ ์ด์ฉํ์ฌ ์๊ฐ 3๊ฐ๊ฐ ์๋ 2๊ฐ๊น์ง๋ง ๊ณฑํด์ง๋๋ก
// โ ๏ธ 3๊ฐ์ ์ซ์๋ฅผ ๊ณฑํ๋ฉด over flow ๊ฐ๋ฅ์ฑ์ด ์๊น
// ex) 2^32 * 2^32 * ๋ ๋ค๋ฅธ ์ => overflow
// ์ง์๊ฐ ํ ์ ์ผ ๋๋ A % C ๋ฅผ ๋ ๊ฑธ์ด์ค์ผํจ.
else ((nextNum * nextNum % C) * (A % C)) % C
}
// B == ์ง์ ์ผ ๋ A ํ์ ๊ณฑ
// A % C ๋ ์ด๋ฏธ base condition ์์ ์ด๋ฏธ ๋ถ๋ฌ์์ง.
// A^2 % c == (A % c) * (A % c) % c
// A ^ 3 % c == ((A % c) * (A % c) * A^1 % c) %C
// A ^ 7 % c == ((A^3 % c) * (A^3 %c) * A % C) % C
// ๊ฒฐํฉ๋ฒ์น์ ์ ์ฉ์ (nextNum * nextNum * A) % C
// (nextNum * nextNum % C * A % C) % C
fun main() {
val br = BufferedReader(InputStreamReader(System.`in`))
val (A, B, C) = br.readLine().split(" ").map(String::toLong)
print(getAB(A, B, C))
}
'Algorithm > Algorithm (๋ฌธ์ ํ์ด)' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[๋ฐฑ์ค] 17835 ๋ฉด์ ๋ณด๋ ์น๋ฒ์ด๋ค (0) | 2022.11.18 |
---|---|
[๋ฐฑ์ค] 4375 1 (0) | 2022.11.17 |
[๋ฐฑ์ค] 2295 ์ธ ์์ ํฉ (1) | 2022.11.05 |
[๋ฐฑ์ค] 18870 ์ขํ ์์ถ (0) | 2022.11.01 |
[๋ฐฑ์ค] 12100 2048 (Easy) (0) | 2022.10.28 |