将斐波那契的性质Fn=Fn-1+Fn-2利用起来,构造出一个A={{1,1},{1,0}}的二维矩阵,则fn可以用A的n-2次方来表示,再加上小学学过的矩阵快速幂,将时间复杂度降为O(logn)
不多BB了,上模板(此模板仅用于斐波那契数列的求解,其他矩阵快速幂得换种写法)
class Solution {
public:
static const int mod=1e9+7;
struct node{
long long a,b,c,d;
node(long long _a=1,long long _b=1,long long _c=1,long long _d=0){
a=_a;
b=_b;
c=_c;
d=_d;
}
node operator *(node x){
node temp;
temp.a = (a*x.a%mod + b*x.c%mod)%mod;
temp.b = (a*x.b%mod + b*x.d%mod)%mod;
temp.c = (c*x.a%mod + d*x.c%mod)%mod;
temp.d = (c*x.b%mod + d*x.d%mod)%mod;
return temp;
}
};
node ksm(node a,int b){
node ans;
while(b){
if(b&1) ans=ans*a;
a=a*a;
b>>=1;
}
return ans;
}
int fib(int n) {
node head;
if(n==0) return 0;
if(n==1) return 1;
head = ksm(head,n-2);
return head.a;
}
};