행렬의 곱셈을 연습하는 문제이다. 각 항을 어떻게 표현 할 것인가?
2x2 행렬의 i행 j열의 요소는 두개의 요소의 곱이 두개씩 합해져 들어간다.
def matrix_mult(a, b):
ret = [[0 ,0], [0, 0]]
for i in range(2):
for j in range(2):
for k in range(2):
ret[i][j] += (a[i][k] * b[k][j]) % MOD
return ret
n = bin(int(input()))[2:]
MOD = 1000000007
base = [[1, 1], [1, 0]]
answer = [[1, 0], [0, 1]]
for i in range(1, len(n) + 1):
if n[-i] == '1':
answer = matrix_mult(answer, base)
base = matrix_mult(base, base)
print(answer[0][1] % MOD)
'practivceAlgorithm > 백준' 카테고리의 다른 글
[백준][Python] 17143 낚시왕 (0) | 2022.01.13 |
---|---|
[백준][Python] 2003 수들의 합2 (0) | 2022.01.13 |
[백준][Python] 11404 플로이드 (0) | 2021.12.19 |
[백준][Python] 2263 트리의 순회 (0) | 2021.12.15 |
[백준][Python] 9251 LCS (0) | 2021.12.15 |