피보나치 수열을 최대 10000번째 숫자까지 구하는 문제.


딱 봐도 long long 을 넘어간다.


그래서 BigInteger를 사용함(Java)

import java.util.*;
import java.io.*;
import java.math.BigInteger;
/**
* https://www.acmicpc.net/problem/10826
* BOJ 백준온라인져지 10826 피보나치 수 4 풀이
*/
class Main {
public static void main(String[] args) throws IOException{
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
int N = Integer.parseInt(br.readLine());
BigInteger fibonacci[] = new BigInteger[N + 3];
fibonacci[0] = BigInteger.ZERO;
fibonacci[1] = BigInteger.ONE;
for(int i = 2; i <= N; i++){
fibonacci[i] = fibonacci[i - 1].add(fibonacci[i - 2]);
}
bw.write(fibonacci[N] + "");
bw.flush();
}
}
view raw BOJ_10826.java hosted with ❤ by GitHub

피보나치 수열을 n으로 나눈 나머지는 주기가 있다.

이 주기를 피사노 주기라고 한다.


나는 이 피사노 주기를 알기 전에 우연히 forloop으로 피보나치 수열을 1000만까지 찍었는데 같은수가 계속 출력돼서 주기가 있다는것을 알았다.


그리고 찾아보니 피사노 주기가 있다는것을 알았다.


#include <cstdio>
/**
* https://www.acmicpc.net/problem/2749
* BOJ 백준온라인져지 2749 피보나치 수 3 풀이
*/
int main(){
unsigned long long N;
scanf("%lld", &N);
int *fibonacci = new int[1500001];
fibonacci[1] = 1;
for(int i = 2; i <= 1500000; i++){
fibonacci[i] = (fibonacci[i - 1] + fibonacci[i - 2]) % 1000000;
}
printf("%d", fibonacci[N % 1500000]);
}
view raw BOJ_2749.cpp hosted with ❤ by GitHub


2, 5번 문제 동일한 코드다.

#include <cstdio>
/**
* https://www.acmicpc.net/problem/2748
* BOJ 백준온라인져지 2748 피보나치 수 2 풀이
*/
int main(){
int N;
scanf("%d", &N);
long long *fibonacci = new long long[N+2];
fibonacci[1] = 1;
for(int i = 2; i <= N; i++){
fibonacci[i] = fibonacci[i - 1] + fibonacci[i - 2];
}
printf("%lld", fibonacci[N]);
}
view raw BOJ_2748.cpp hosted with ❤ by GitHub


+ Recent posts