Computer Science/백준

백준 11444번 피보나치 수 6

Dior2ky 2021. 8. 31. 16:22
반응형

백준 11444번 피보나치 수 6 문제이다. 

 

문제는 다음과 같다. 

 

문제만 봤을때는 이게 왜 분할정복 분류지? 걍 하면 되겠는데? 하고 했다가 메모리 초과, 시간초과가 발생했다...

찾아보니 행렬을 이용한 방법이 있었다. 

 

 

코드는 다음과 같다. 

import sys


def mat_pow(mat, n):
    if n == 0:
        return mat
    elif n == 1:
        return mat
    else:
        tmp = mat_pow(mat, n//2)
        if n % 2 == 0:
            result = mul(tmp, tmp)
        else:
            a = [1, 1, 1, 0]
            result = mul(mul(tmp, tmp), mat)
    return result


def mul(a, b):
    c = [(a[0] * b[0] + a[1] * b[2]) % 1000000007, (a[0] * b[1] + a[1] * b[3]) % 1000000007,
         (a[2] * b[0] + a[3] * b[2]) % 1000000007, (a[2] * b[1] + a[3] * b[3]) % 1000000007]
    return c


n = int(sys.stdin.readline().strip())
mat = [1, 1, 1, 0]
fibo = mat_pow(mat, n-1)
print(fibo[0])

ㅎ 행렬 곱을 이용해서 피보나치 수를 구현했다.

분류되어있는 것을 무시하지 말자....

 

성공!

반응형

'Computer Science > 백준' 카테고리의 다른 글

아스키(ASCII) 코드표  (0) 2021.11.29
백준 1922번 쿼드트리  (0) 2021.08.31
백준 1780번 종이의 개수  (0) 2021.08.31
백준 2630번 색종이 만들기  (0) 2021.08.30
백준 1655번 가운데를 말해요  (0) 2021.08.30