Corgi Dog Bark

ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 백준 2749
    알고리즘/백준(BOJ) 2021. 6. 16. 01:43
    반응형

    2749번: 피보나치 수 3 (acmicpc.net)

     

    2749번: 피보나치 수 3

    첫째 줄에 n이 주어진다. n은 1,000,000,000,000,000,000보다 작거나 같은 자연수이다.

    www.acmicpc.net

     

     

    문제


    피보나치 수는 0과 1로 시작한다. 0번째 피보나치 수는 0이고, 1번째 피보나치 수는 1이다. 그 다음 2번째 부터는 바로 앞 두 피보나치 수의 합이 된다.

    이를 식으로 써보면 Fn = Fn-1 + Fn-2 (n ≥ 2)가 된다.

    n=17일때 까지 피보나치 수를 써보면 다음과 같다.

    0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377, 610, 987, 1597

    n이 주어졌을 때, n번째 피보나치 수를 구하는 프로그램을 작성하시오.

     

     

     

     

     

    입력


    첫째 줄에 n이 주어진다. n은 1,000,000,000,000,000,000보다 작거나 같은 자연수이다.

     

     

     

     

     

     

    출력


    첫째 줄에 n번째 피보나치 수를 1,000,000으로 나눈 나머지를 출력한다.

     

     

     

     

     

     

     

    접근법


    1. 피보나치 수를 M 으로 나누었을 때, 일정한 주기 Period를 가지게 된다.
    2. 일정한 주기 Period 일때, fibo[i-1] % M == 1 그리고, fibo[i-2] % M == 0  이게 되면, 저절로 fibo[0]=0 , fibo[1]=1 을 만족시키는 Period 가 생기게 된다. ( 코드 구현에서 line 12 ~ 14) (참고) M = 10k 일 때, k > 2 라면, 주기는 항상 15 × 10k-1 입니다. 이 사실을 모른다고 해도, 주기를 구하는 코드를 이용해서 문제를 풀 수 있습니다.

    ref. 피보나치 수를 구하는 여러가지 방법 (acmicpc.net)

    # 주기의 길이가 p 이면, N번쨰 피보나치수를 M으로 나눈 나머지는 
    # N%P 번째 피보나치수를 M으로 나눈 나머지와 같다.
    
    mod = 1000000 
    period = 0
    fibo = [0,1]
    
    n = int(input())
    
    for i in range(2,mod*mod):
        fibo.append((fibo[i-1]+fibo[i-2])%1000000)
        # period를 모르기 때문에 직접 period 를 구해주었다.
        if i!=2 and fibo[i-1] == 0 and fibo[i-2]==1: 
            period = i-1
            break
    print(fibo[n%(period)])
    반응형

    '알고리즘 > 백준(BOJ)' 카테고리의 다른 글

    백준 16194 c++  (0) 2021.10.14
    백준 15656_C++  (0) 2021.10.12
    백준 12865  (0) 2021.06.16
    백준 _ 3111  (0) 2021.04.13
    백준 7785 _ Python  (1) 2021.04.13

    댓글

Designed by Tistory.