时间限制:1秒 空间限制:32768K 热度指数:419054
题目描述
大家都知道斐波那契数列,现在要求输入一个整数n,请你输出斐波那契数列的第n项(从0开始,第0项为0)。
n<=39
O(n)
class Solution {
public:
int Fibonacci(int n) {
int f[1000];
f[0]=0,f[1]=1;
if(n<=1)return f[n];
for(int i=2;i<=n;i++){
f[i]=f[i-2]+f[i-1];
}
return f[n];
}
};
O(logn): →
class Solution {
public:
typedef struct{
int d[2][2];
}Ma;
int Fibonacci(int n) {
if(n==1)return 1;
if(n==0)return 0;
Ma q={1,0,0,1};//单位阵
Ma res={1,1,1,0};
n-=1;
while(n){ //矩阵快速幂
if(n&1){
q=comb(res,q);
}
n>>=1;
res=comb(res,res);
}
return q.d[0][0];
}
Ma comb(Ma a,Ma b) //矩阵乘法
{
Ma c;
for(int i=0;i<2;i++)
for(int j=0;j<2;j++){
c.d[i][j]=0;
for(int k=0;k<2;k++)
c.d[i][j]+=a.d[i][k]*b.d[k][j];
}
return c;
}
};