a*b,只有當a的列數等於b的行數時才有意義,即a為n∗
m 的矩陣,b為m∗
l 的矩陣。矩陣的乘法定義如下: [a
dbec
f]∗⎡
⎣⎢gi
khjl
⎤⎦⎥=
[ag+
bi+c
kdg+
ei+f
kah+
bj+c
ldh+
ej+f
l] 即
ci,j
=∑k=
1ma[
i][k
]+b[
k][j
] 由定義可知,矩陣乘法滿足結合律,但不滿足交換律。
矩陣乘法可以用來優化很多線性遞推式,下面以求斐波那契為例。
我們知道,f[
n]=f
[n−1
]+f[
n−2]
,可以構造乙個矩陣a,使得a*[f
[n]f
[n−1
]]=[
f[n]
+f[n
−1]f
[n]]
,這樣,初始矩陣[1
0]每乘一次a陣列,矩陣的第一位就往下推了乙個,那麼,要求第n項只要乘n-1次,而由於矩陣的乘法是滿足結合律的,所以可以用快速冪來求矩陣a的n-1次冪,複雜度大大降低。
那麼,如何設計矩陣a呢?
顯然,a是乙個2*2的矩陣,設a=
[acb
d]則a∗[
f[n]
f[n−
1]]=
[a∗f
[n]+
b∗f[
n−1]
c∗f[
n]+d
∗f[n
−1]]
,顯然,a=1,b=1,c=1,d=0,這樣,我們就構造出a=
[111
0]剩下的事就交給快速冪了。
下面附上poj3070的**:
#include
#include
#include
#define maxn 5
#define tt 10000
using
namespace
std;
inline
char nc()
inline
int _read()
struct matrix
return c;
}};int n;
matrix g,ans;
matrix power(matrix x,int y)
int main()
if(n==1)
g=power(g,n-1);
ans=g*ans;
printf("%d\n",ans.a[1][1]);
n=_read();
}return
0;}
斐波那契數列 矩陣乘法
f 1 1 f 2 1 f n f n 1 f n 2 n 2 且 n 為整數 題目描述 請你求出 f n mod 1000000007 的值。輸入輸出格式 輸入格式 第 1 行 乙個整數 n 輸出格式 第 1 行 f n mod 1000000007 的值 輸入輸出樣例 輸入樣例 1 5輸出樣例 ...
矩陣乘法 斐波那契數列II III IV
ii 求出斐波那契數列的第n項 1 n 2 31 模10000的值 iii 求出f n f n 2 f n 1 1模9973的值 iv 求出f n f n 2 f n 1 n 1模9973的值 f 1 f 2 1 ii 矩陣乘法,設矩陣 那麼顯然可以乘矩陣 得到矩陣 那麼得式子 a 即 a 1 同時...
矩陣乘法 求斐波那契數列
先簡單介紹一下矩陣乘法求斐波那契數列的原理 f n 是第n項的值。f 1 1 f 2 1 f n f n 1 n 2 下面的介紹是我從網上查到了,收益匪淺。分兩步推導 問題的求解就變成 二分法可用遞迴和非遞迴來求 下面是 定義矩陣 struct matrix 定義2 2的矩陣 void mul ma...