문제 출처: https://www.acmicpc.net/problem/2749




참고: https://png93.github.io/baekjoon-2749-fibonacci/

피보나치 수를 나눈 나머지는 항상 주기를 가진다. 이를 피사노 주기(Pisano Period)라 한다.

그림 출처: http://nackwon.tistory.com/52


피보나치 수를 나눌 수를 K라고 할 때,이면, 피사노 주기는 이다.

즉, k가 10의 6승인 1,000,000이면 피사노 주기는 1,500,000이다.

1,500,000번째 까지의 피보나치 수를 1,000,000로 나눈 나머지 값들을 구하면 그 이후의 수는 계산할 필요가 없다.



1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
import java.io.BufferedReader;
import java.io.InputStreamReader;
 
public class Main {
    public static void main(String[] args) throws Exception {
        BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
        long n = Long.parseLong(reader.readLine());
        int pisano = 1500000// 피사노 주기
        long[] arr = new long[pisano];
        arr[0= 0; arr[1= 1;
 
        for(int i=; i<pisano && i<=n ; i++){
            arr[i] = (arr[i-1+ arr[i-2]) % 1000000;  // 피보나치 수를 1,000,000 으로 나눈 나머지 값을 저장 
        }
 
        if(n >=pisano){
            n %= pisano;
        }
 
        System.out.println(arr[(int) n]);
    }
}
cs


'Algorithm' 카테고리의 다른 글

백준 1932번: 정수 삼각형  (0) 2018.11.01
백준 1149번: RGB거리  (0) 2018.11.01
백준 2748번: 피보나치 수 2  (0) 2018.10.31
백준 2747번: 피보나치 수  (0) 2018.10.31
백준 2667번: 단지번호붙이기  (0) 2018.10.26

+ Recent posts