๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
๐Ÿ“Š Algorithm/BOJ

[์ฝ”ํ…Œ] 2206 - ํ”ผ๋ณด๋‚˜์น˜ ํ–‰๋ ฌ์—ฐ์‚ฐ

by huis_log 2025. 6. 28.
[BOJ 11444] ํ”ผ๋ณด๋‚˜์น˜ ์ˆ˜ 6

๐Ÿ“Œ [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)์œผ๋กœ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๋‹ค.

โœ… ๊ทธ๋ž˜์„œ ์ด๋ ‡๊ฒŒ ํ•จ

  1. ๊ธฐ๋ณธ 2ร—2 ํ–‰๋ ฌ:
    $$ A = \begin{bmatrix} 1 & 1 \\\\ 1 & 0 \end{bmatrix} $$
  2. ํ–‰๋ ฌ ๊ฑฐ๋“ญ์ œ๊ณฑ:
    ์ง์ˆ˜: \( A^n = (A^{n/2})^2 \)
    ํ™€์ˆ˜: \( A^n = A^{n-1} \times A \)
  3. ๋‹จ์œ„ ํ–‰๋ ฌ:
    $$ I = \begin{bmatrix} 1 & 0 \\\\ 0 & 1 \end{bmatrix} $$
    ์ง€์ˆ˜๊ฐ€ 0์ด๋ฉด ๋‹จ์œ„ ํ–‰๋ ฌ ๋ฐ˜ํ™˜
  4. ๊ธฐ๋ณธ ๋ฒกํ„ฐ: [1, 0]
  5. ๊ณฑ์…ˆ ์‹œ 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)์œผ๋กœ ๊ตฌํ•  ์ˆ˜ ์žˆ๋‹ค! ๐Ÿš€

๋ฐ˜์‘ํ˜•