BOJ
[BOJ][Python] 백준 32454번 - Fibonacci Lucky Numbers
송댕
2024. 10. 25. 11:27
728x90
문제 링크: https://www.acmicpc.net/problem/32454
문제 풀이
피사노 주기, 오일러 피 함수, 분할 정복을 이용한 거듭제곱
일단
피사노 주기를 이용하면 된다. 피보나치 수에서 나누는 값이
이 값을 역순으로 계산하면
즉,
그리고 이
코드
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
import sys | |
input = sys.stdin.readline | |
mod = int(1e10) | |
def calc(m1, m2): | |
matrix = [[0 for _ in range(2)] for _ in range(2)] | |
for i in range(2): | |
for j in range(2): | |
for k in range(2): | |
matrix[i][j] += m1[i][k] * m2[k][j] | |
matrix[i][j] %= mod | |
return matrix | |
def func(mat, n): | |
if n == 1: | |
return mat | |
else: | |
if n % 2 == 0: | |
new = func(mat, n//2) | |
return calc(new, new) | |
else: | |
return calc(func(mat, n-1), mat) | |
for _ in range(int(input())): | |
n = int(input()) | |
matrix = [[1, 1], [1, 0]] | |
e1 = pow(7, n, 16*int(1e7)) | |
e2 = pow(7, e1, 4*int(1e8)) | |
e3 = pow(7, e2, 15*int(1e9)) | |
if e3 <= 1: rans = '0'*9+str(e3) | |
else: rans = str((func(matrix, e3-1)[0][0])%mod).zfill(10) | |
print(rans) |
728x90