[백준] 2749번 피보나치 수 3 (파이썬)

dongEon·2023년 4월 28일
0

난이도 GOLD II

문제링크 : https://www.acmicpc.net/problem/2749

문제해결 아이디어

  • N이 매우 크기 때문에 재귀로 접근하면 시간초과가 발생하고
  • DP로 접근하면 메모리 초과가 발생한다.
  • 피사노 주기를 활용해야 한다고 한다.

피사노 주기란?
피보나치 수를 K로 나눈 나머지는 항상 주기를 갖게 되는데 이를 피사노 주기라고 합니다.
주기의 길이가 P이면 N번째 피보나치 수를 M으로 나눈 나머지=(N% P) 번째 피보나치 수를 M을 나눈 나머지와 같은 공식을 얻을 수 있습니다.

나누려는 수가 10^k이고 이때의 k가 2보다 크다면 주기는 항상 15*10^(k-1)이 됩니다.

문제에 나오는 수로 대입을 해보면 M=10^6이기 때문에 주기는 15*10^5=1500000이고 이것을 이용하여 다음과 같이 해결할 수 있습니다.

소스코드

M=1000000
P=1500000

N = int(input())

def fibo3(n):
    a, b = 0, 1

    for _ in range(n):
        a, b = b%M, (a+b)%M
    return a

print(fibo3(N%P))
profile
개발 중에 마주한 문제와 해결 과정, 새롭게 배운 지식, 그리고 알고리즘 문제 해결에 대한 다양한 인사이트를 공유하는 기술 블로그입니다

0개의 댓글