알고리즘/백준
백준 2749 - 피보나치 수3(Java)
D_Helloper
2024. 4. 29. 21:47
풀이
못풀었다. 정답을 봤다.
피사노주기? 라는 게 있더라. 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]);
}
}