要求:
思路:直接循环求,优化为logn关键是快速幂,快速幂的意思是a^9,9可拆为1001,正常要乘8次但是可以通过除以2,计算a的2三次方*a的2零次方。也就是说,n&1为真时ans乘上a,其他时间在滚大a,从一次二次四次…换成矩阵
法一:O(n)
class Solution {
public:
int fib(int n) {
int fn_2=0,fn_1=1,fn;
while(n--){
fn=fn_1%1000000007+fn_2%1000000007;
fn_2=fn_1;
fn_1=fn;
}
return fn_2%1000000007;
}
};
法二:O(logn)
class Solution {
public:
void mul(int a[2][2],int b[2][2]){
int tmp[2][2]={{0,0},{0,0}};
for(int i=0;i<2;++i){
for(int j=0;j<2;++j){
for(int k=0;k<2;++k){
tmp[i][j]+=long((a[i][k]%(1000000007)))*(b[k][j]%(1000000007))%(1000000007);
}
}
}
for(int i=0;i<2;++i){
for(int j=0;j<2;++j){
a[i][j]=tmp[i][j]%1000000007;
}
}
}
int fib(int n) {
if(n==0)return 0;
int base[2][2]={{1,1},{1,0}};
int ans[2][2]={{1,0},{0,1}};
n--;
while(n){
if(n&1)mul(ans,base);
mul(base,base);
n>>=1;
}
return ans[0][0];
}
};