알고리즘/백준

백준 2749 - 피보나치 수3(Java)

D_Helloper 2024. 4. 29. 21:47

입력

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

출력

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

예제 입력 1 복사

1000

예제 출력 1 복사

228875​

 

풀이

못풀었다. 정답을 봤다.

피사노주기? 라는 게 있더라. m 이라는 숫자를 주고, 피보나치 수열에서 m 으로 나누었을 때의 나머지 값이 수열을 이룬다고 한다. 

특정 주기마다 1 2 3 0 1 2 3 0 이런식으로 반복된단 얘기, 여기서 피사노주기는 1230까지 해서 4이다.

그럼 이 피사노 주기는 어떻게 구하는가?

M = 10^k 일 때, k > 2 라면, 주기는 항상 15 × 10^(k-1) 라고 한다.

 

해당 문제에선 100만으로 나눈다고 했다. 그럼 M = 10^6이고, 15 x 10^(6-1) = 15 * 100,000 = 1,500,000이 된다.

이걸로 나눠서 구하면 된다고 한다.

하나 배웠다. 피사노주기.

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;

public class BJ_2749_피보나치수3 {
    static long[] fibo;
    //K가 100만, 10^6, 피사노주기는 15*10^5 = 15*100000
    static int pisano = 15*100000;

    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st = new StringTokenizer(br.readLine());

        long N = Long.parseLong(st.nextToken());
        N %= pisano;
        fibo = new long[(int) N+1];
        fibo[0] = 0;
        fibo[1] = 1;
        for (int i = 2; i <= N; i++) {
            fibo[i] = (fibo[i - 1] + fibo[i - 2]) % 1000000;
        }
        System.out.println(fibo[(int) N]);

    }
}