矩陣快速冪
模擬過程
眾所周知:斐波那契數列的定義是f(n + 1) = f(n) + f(n - 1)
我們有兩種方式來實現:乙個是遞迴,乙個是動態規劃
int
dfs(
int n)
經典做法只要數一大就會超時,我們可以用矩陣快速冪進行優化,能將時間複雜度降到o(logn)int
dfs03
(int n)
return vec[i-1]
;}
(如果全位輸出斐波那契數,貌似最大能演算法到93,但是如果帶mod,那就可以算很大)
常用於求第n位斐波那契數的後x位(mod 10x)
快速冪+矩陣
矩陣乘法:左矩陣的第一行乘以右矩陣的第一列(分別相乘),乘完後相加
單位矩陣: nn的矩陣 mat ( i , i )=1; 任何乙個矩陣乘以單位矩陣就是它本身 n單位矩陣=n, 可以把單位矩陣等價為整數1。(單位矩陣用在矩陣快速冪中)
在斐波那契數列中:
f[n ] = 1 * f[n-1] + 1 * f [n - 2]
f[n-1] =1 * f[n-1] +0 * f [n - 2]
我們用矩陣來表示:
這就表示了斐波那契數列如何用矩陣來實現。
#include
#include
#include
#include
using
namespace std;
typedef
long
long ll;
const
int mod=
10000
;typedef vector vec;
typedef vector mat;
mat mul
(mat &a,mat &b)}}
return c;
} mat pow
(mat a,ll n)
return res;
} ll solve
(ll n)
intmain()
return0;
}
poj 3070#include
using
namespace std;
typedef
long
long ll;
const ll mod=
1000000007
;struct matrix //定義結構體矩陣
;matrix mul
(matrix a,matrix b)
//矩陣乘法運算}}
return ans;
}matrix quickpow
(matrix p,ll n)
//矩陣快速冪,與快速冪道理方法相同
//一開始初始化他為單位陣
else ans.x[i]
[j]=0;
}}while
(n)//快速冪
p=mul(p,p)
; n>>=1;
}return ans;
}int
main()
;
ll n;
cin>>n;
ll ans1=0;
matrix ans=
quickpow
(m,n-1)
; cout<
[1]<
return0;
}
如果數很大,比如求1000的斐波那契數列,矩陣快速冪也求不出來,那咋辦?
我們可以模擬斐波那契數列數列計算的過程,斐波那契數列的定義是f(n + 1) = f(n) + f(n - 1),我們可以手寫加減,模擬進行加減運算
例題 大菲波數
h du - 1715
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
using
namespace std;
typedef
long
long ll;
intmain()
;for
(i=0
;i2;i++)if
(b[j]
>=
'0')
if(temp>=10)
else
c[j+1]
=1+'0';}
else
else
}else}}
strcpy
(a, b)
;strcpy
(b, c)
;memset
(c,0
,sizeof
(c));}
int len=
strlen
(b);
for(i=len-
1;i>=
0;i--
)printf
("\n");
}return0;
}
斐波那契數列 斐波那契數列python實現
斐波那契數列 fibonacci sequence 又稱 分割數列 因數學家列昂納多 斐波那契 leonardoda fibonacci 以兔子繁殖為例子而引入,故又稱為 兔子數列 指的是這樣乙個數列 1 1 2 3 5 8 13 21 34 在數學上,斐波納契數列以如下被以遞推的方法定義 f 1 ...
迴圈斐波那契數列 斐波那契數列應用
什麼是斐波那契數列 斐波那契數列指的是這樣乙個數列 1,1,2,3,5,8,13,21,34,55,89,144 這個數列從第3項開始,每一項都等於前兩項之和 台階問題 有一段樓梯有10級台階,規定每一步只能跨一級或兩級,要登上第10級台階有幾種不同的走法?這就是乙個斐波那契數列 登上第一級台階有一...
斐波那契數列 優化矩陣求法例項
一 遞迴 遞迴是最慢的會發生重複計算,時間複雜度成指數級。複製 如下 long long fac int n 二 迴圈 利用臨時變數來儲存中間的計算過程,加快運算。複製 如下 long long fac int n return b 三 矩陣乘法 空間換時間 減少乘法,取模運算 數列的遞推公式為 f...