๐ [BOJ 11444] ํผ๋ณด๋์น ์ 6
โ ์?
์ผ๋ฐ DP ํผ๋ณด๋์น๋ O(N)
์
๋ ฅ ์ต๋ N = 1018 โ O(N) ๋ถ๊ฐ
๋ฐ๋์ O(log N)์ผ๋ก ํ์ด์ผ ํจ
โ ์ด์
ํผ๋ณด๋์น๋ ์ ํ์์ด ์๋ค:
$$ F(n) = F(n-1) + F(n-2) $$
์ด๊ฑธ ํ๋ ฌ๋ก ๋ฐ๊ฟ ์ ์๋ค:
$$ \begin{bmatrix} F(n) \\\\ F(n-1) \end{bmatrix} = \begin{bmatrix} 1 & 1 \\\\ 1 & 0 \end{bmatrix}^{n-1} \begin{bmatrix} F(1) \\\\ F(0) \end{bmatrix} $$
๊ฑฐ๋ญ์ ๊ณฑ ๋ถํ ๋ก ํ๋ ฌ ๊ฑฐ๋ญ์ ๊ณฑ์ O(log N)์ผ๋ก ์ฒ๋ฆฌํ ์ ์๋ค.
โ ๊ทธ๋์ ์ด๋ ๊ฒ ํจ
- ๊ธฐ๋ณธ 2ร2 ํ๋ ฌ:
$$ A = \begin{bmatrix} 1 & 1 \\\\ 1 & 0 \end{bmatrix} $$ - ํ๋ ฌ ๊ฑฐ๋ญ์ ๊ณฑ:
์ง์: \( A^n = (A^{n/2})^2 \)
ํ์: \( A^n = A^{n-1} \times A \) - ๋จ์ ํ๋ ฌ:
$$ I = \begin{bmatrix} 1 & 0 \\\\ 0 & 1 \end{bmatrix} $$
์ง์๊ฐ 0์ด๋ฉด ๋จ์ ํ๋ ฌ ๋ฐํ - ๊ธฐ๋ณธ ๋ฒกํฐ: [1, 0]
- ๊ณฑ์ ์ MOD๋ฅผ ๋ฐ๋์ ์ค๊ฐ์ ๋๋ ์ ํฐ ์ ์ฐ์ฐ ์ต์ ํ
โ ํต์ฌ ์ฃผ์
- ์ค๊ฐ ๊ณฑ์
์ MOD ์์ผ๋ฉด ์๊ฐ ์ด๊ณผ!
- ํ์ด์ฌ ํฐ ์ ๊ณฑ์
์ ๋๋ฆฌ๋ฏ๋ก ๋ฐ๋์ ๋๋จธ์ง๋ก ์๋ผ์ ์ฐ์ฐ๋ ์ค์ด๊ธฐ
๐ข ํต์ฌ ์ฝ๋
MOD = 10**9 + 7
def mat_mul(A, B):
result = [[0, 0], [0, 0]]
for i in range(2):
for j in range(2):
for k in range(2):
result[i][j] += (A[i][k] * B[k][j]) % MOD
result[i][j] %= MOD
return result
def fast_pow(mat, exp):
if exp == 0:
return [[1, 0], [0, 1]]
if exp == 1:
return mat
if exp % 2 == 0:
half = fast_pow(mat, exp // 2)
return mat_mul(half, half)
else:
half = fast_pow(mat, exp - 1)
return mat_mul(half, mat)
base = [[1, 1], [1, 0]]
result = fast_pow(base, n - 1)
vector = [1, 0]
answer = [0, 0]
for i in range(2):
for j in range(2):
answer[i] += result[i][j] * vector[j]
answer[i] %= MOD
print(answer[0])
์ด๋ ๊ฒ ํ๋ฉด ํผ๋ณด๋์น ์๋ฅผ O(log N)์ผ๋ก ๊ตฌํ ์ ์๋ค! ๐
๋ฐ์ํ
'๐ Algorithm > BOJ' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
| โ BOJ 1043 - ์ ๋์จ ํ์ธ๋ (0) | 2025.07.02 |
|---|---|
| โ BOJ 1918 - ์คํ (0) | 2025.07.01 |
| โ BOJ 1865 - ๋ฒจ๋งํฌ๋ (0) | 2025.06.27 |
| โ BOJ 1238 - ๋ค์ต์คํธ๋ผ (0) | 2025.06.27 |
| [์๋ฃ๊ตฌ์กฐ] ์ฐ์ ์์ ํ & ํ (0) | 2025.01.24 |