题意理解
fn+1=fn+fn-1
问题分析
递归慢。常规的用动规,时间复杂度on;用快速幂,时间复杂度olgn。
其他
链接
动规
class Solution {
public:
int fib(int n) {
if (n == 0) return 0;
if (n == 1) return 1;
long c = 1e9+7;
// long a = fib(n-1) % c;
// long b = fib(n-2) % c;
long p = 0;
long q = 1;
long r = 1;
for(int i = 3; i <= n; i++) {
p = q % c;
q = r % c;
r = (p + q) % c;
}
return r;
}
};
class Solution {
public:
const int MOD = 1000000007;
int fib(int n) {
if (n < 2) {
return n;
}
vector<vector<long>> q{{1,1}, {1,0}};
vector<vector<long>> res = pow(q, n - 1);
return res[0][0];
}
vector<vector<long>> pow(vector<vector<long>>& a, int n) {
vector<vector<long>> ret {{1,0},{0,1}};
while(n > 0) {
if (n & 1) {
ret = multiply(ret, a);
}
n >>= 1;
a = multiply(a, a);
}
return ret;
}
vector<vector<long>> multiply(vector<vector<long>>& a, vector<vector<long>>& b) {
vector<vector<long>> c {{0,0},{0,0}};
for (int i = 0; i < 2; i++) {
for (int j = 0; j < 2; j++) {
c[i][j] = (a[i][0] * b[0][j] + a[i][1] * b[1][j]) % MOD;
}
}
return c;
}
};
用快速幂