参考:https://blog.youkuaiyun.com/flyfish1986/article/details/48014523
http://jcf94.com/2015/02/09/2015-02-09-juzhengkuaisumi/
Fn 需要求 (n-1) 次 基数模板, 最后的结果取左上角即可。
#include<iostream>
using namespace std;
class Solution {
private:
int e[2][2];
public:
int Fibonacci(int n){
if (n<2)return n;
int t = bigpow(n-1);
return t;
}
void Init(){
e[0][0] = 1; e[0][1] = 1;
e[1][0] = 1; e[1][1] = 0;
}
void Unin(){
e[0][0] = 1; e[0][1] = 0;
e[1][0] = 0; e[1][1] = 1;
}
int Get() {
return e[0][0];
}
friend Solution operator*( Solution A, Solution B)
{
Solution C;
for (int i=0;i<2;i++)
{
for (int j=0;j<2;j++)
{
C.e[i][j] = 0;
for (int k=0;k<2;k++)
{
C.e[i][j] += A.e[i][k]*B.e[k][j];
}
}
}
return C;
}
int bigpow(int n)
{
Solution A;
Solution B;
A.Unin();
B.Init();
while (n)
{
if (n&1)A = A * B ;
n>>=1;
B = B * B;
//cout<<"-----"<<endl;
//cout<<B.Get();
}
return A.Get();
}
};
int main()
{
Solution a;
cout<<a.Fibonacci(5);
getchar();
return 0;
}