教育後臺管理系統:Maven的常用命令 & 依賴範圍
阿新 • • 發佈:2021-10-23
遞迴
時間複雜度指數級,很多值重複計算
動態規劃
class Solution { public: int fib(int n) { int MOD=1000000007; if(n<2) { return n; } int a=0,b=1,tmp=0; for(int i=2;i<=n;i++) { tmp=b; b=(a+b)%1000000007; a=tmp; } return b; } };
矩陣快速冪
斐波那契數列數列,可以認為是
轉化為一個矩陣的n次方和一個矩陣的乘積,優化的地方在於求n次方,我們可以使用快速冪,當然矩陣的快速冪比實數的快速冪複雜一點。
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>> ans = pow(q,n-1); return ans[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; } };