这道题就是一道裸的矩阵快速幂,矩阵快速幂在求解递归问题上效率非常高,可将线性的时间复杂度降为O(log(n)),大大降低了程序的运行时间。
构造的矩阵为 [1 1] 这样就可以求出最后的结果了,结果每次取模,就得到了最终的结果。
[1 0]
//Fibonacci matrixquickpow
#include <iostream>
#include <cstdio>
#include <vector>
#include <cstring>
using namespace std;
typedef long long LL ;
typedef vector<int> vec;
typedef vector<vec> mat;
const int MOD = 10000;
mat mul(mat a, mat b)
{
mat c(a.size(), vec(b[0].size()));
for(int i=0; i<a.size(); i++)
for(int j=0; j<b[0].size(); j++)
{
c[i][j] = 0;
for(int k=0; k<a[0].size(); k++)
c[i][j] = (c[i][j] + a[i][k] * b[k][j])%MOD;
}
return c;
}
mat matrix_quickpow(mat input, int n)
{
mat result(input.size(), vec(input[0].size()));
for(int i=0; i<input.size(); i++)
for(int j=0; j<input[0].size(); j++)
if(i == j)
result[i][j] = 1;
else
result[i][j] = 0;
while(n)
{
if(n&1)
result = mul(result, input);
input = mul(input, input);
n >>= 1;
}
return result;
}
int main()
{
int n;
while(cin>>n)
{
if(n == -1)
break;
mat init(2, vec(2));
init[0][0] = 1;
init[0][1] = 1;
init[1][0] = 1;
init[1][1] = 0;
mat result = matrix_quickpow(init, n);
cout<<result[1][0]<<endl;
}
return 0;
}