풀이


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

피보나치 수를 3으로 나누었을 때 주기는 8이 된다.

 

이 때, 주기의 길이가 P라면:

    N번째 피보나치 수를 K로 나눈 나머지 == N%P번째 피보나치 수를 K로 나눈 나머지

 

 

 

코드


C++ 언어를 이용해 코드를 살펴보자.

#include <iostream>
using namespace std;
// 주기를 구하는 공식
// 피보나치 수를 M으로 나눈 나머지를 구하는 문제에서 나머지는 주기를 가지게 된다. ('파사노 주기'라고 한다.)
// M = 10^k일 때, k>2라면 주기는 15 * 10^(k-1)
constexpr int MOD = 1000000;
constexpr int P = (MOD / 10) * 15; // M=10^6이니 주기는 15*10^5가 된다.
int fibo[P] = {0, 1};
int main() {
long long n;
cin >> n;
for (int i = 2; i < P; ++i) {
fibo[i] = fibo[i - 1] + fibo[i - 2];
fibo[i] %= MOD;
}
cout << fibo[n % P] << "\n";
return 0;
}

 

 

 

참고자료


[1] https://www.acmicpc.net/blog/view/28

 

댓글

댓글을 사용할 수 없습니다.