Backjoon Online Judge
"2749번 : 피보나치 수 3" 문제입니다.
문제 링크 : https://www.acmicpc.net/problem/2749
피보나치 수 3번의 경우 N의 범위가 매우 크기에 일반적인 방법으로 피보나치 수를 구할 경우 long long int에서 저장 가능 한 범위를 초과하기 때문에 제대로 된 답이 나오지 않습니다.
피보나치 수의 특징으로 피보나치 수를 나눈 나머지는 주기성을 띄게 됩니다.
(=피사노 주기) 이를 활용하여 문제를 풀어가게 됩니다.
피사노 주기에서 길이가 1,000,000 일 경우, 주기 Period는 1,500,000이 됩니다.
- FIBO의 값을 일반적인 방식으로 구하되, 1,000,000이 넘는 경우 나머지만을 저장했습니다.
- FIBO의 값이 주기에 해당하는 값을 넘는 경우 값은 순환하므로 더 이상 구하지 않았습니다.
- n / 주기의 결과를 구해 n번째 값이 어느곳과 같은지를 확인하고 이를 출력했습니다.
코드는 C++로 작성하였습니다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | #include <iostream> #define MOD 1000000 #define PERIOD 1500000 using namespace std; int main() { int fibo[PERIOD] = { 0,1 }; long long int n; cin >> n; for (int i = 2; i<PERIOD; i++) { fibo[i] = fibo[i - 1] + fibo[i - 2]; fibo[i] %= MOD; } cout << fibo[n % PERIOD] << '\n'; return 0; } | cs |
'Programming 문제풀이 > Backjoon Online Judge' 카테고리의 다른 글
1149번 : RGB거리 (0) | 2018.04.01 |
---|---|
1003번 : 피보나치 함수 (0) | 2018.04.01 |
2748번 : 피보나치 수 2 (0) | 2018.04.01 |
2747번 : 피보나치 수 (0) | 2018.04.01 |
5430번 : AC (0) | 2018.03.28 |