链接
题意
求fibonacci数的第k项。
题解
基本上是题目告诉了你一个结论:
矩阵
|1 1|
|1 0|
的k次幂就是
|fibon[k+1] fibon[k]|
|fibon[k] fibon[k-1]|
由于k比较大,所以需要用到矩阵快速幂。
但是这个结论还是比较有用的,可以在logn级求出fibonacci的第k项。
代码
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;
const int mod = 10000;
struct fibonmat
{
int a[2][2];
fibonmat() { a[0][0] = a[0][1] = a[1][0] = 1, a[1][1] = 0; }
void clear() { memset(a, 0, sizeof(a)); }
fibonmat operator*(const fibonmat& b) const
{
fibonmat o;
o.a[0][0] = (a[0][0] * b.a[0][0] + a[0][1] * b.a[1][0]) % mod;
o.a[0][1] = (a[0][0] * b.a[0][1] + a[0][1] * b.a[1][1]) % mod;
o.a[1][0] = (a[1][0] * b.a[0][0] + a[1][1] * b.a[1][0]) % mod;
o.a[1][1] = (a[1][0] * b.a[0][1] + a[1][1] * b.a[1][1]) % mod;
return o;
}
friend fibonmat operator^(fibonmat tmp, int k)
{
fibonmat o; o.clear();
o.a[0][0] = o.a[1][1] = 1;
while(k)
{
if(k & 1) o = o * tmp;
tmp = tmp * tmp;
k >>= 1;
}
return o;
}
};
int getKthfibon(int k)
{
if(0 == k) return 0;
fibonmat fm;
fm = fm ^ k;
return fm.a[0][1];
}
int main()
{
int n, fi;
while(cin >> n)
{
if(n == -1) break;
fi = getKthfibon(n);
cout << fi << endl;
}
return 0;
}