考慮fi
bona
cci 數列, f(
n)=f
(n−1
)+f(
n−2)
將右邊兩項看做是乙個列向量的形式,令 x
n−1=
很容易得到xn
的形式,即 x
n=現在的任務就是找到乙個係數矩陣a
,使得axn
−1=x
n ,且a
需與n
無關。
如果能夠找到這個a
,則易知an
−1x1
=xn
,於是可以利用矩陣快速冪計算出xn
。這樣就可以在o(
logn)
的時間內計算出指定的fi
bona
cci
數。 這個矩陣很容易找,觀察易得 a
=(1)
推廣一下,如果令fn
=afn
−1+b
fn−2
,則係數矩陣為 a=
(2)fib
onac
ci數列只是最簡單的例子,對於稍微複雜一點的例子,二項式展開是常用的一項技術。
考慮計算: sn
=∑i=
1nik
易得 sn
=nk+
sn−1
如果仿照fi
bona
cci
數列,令 x
n−1=
則 xn
=此時,可求出 a
=⎧⎩⎨
⎪⎪(n
+1n)
k101
⎫⎭⎬⎪
⎪這個係數矩陣很明顯是不能用的,因為它與n
有關,無法將遞推公式轉化為矩陣的冪運算。
這裡需要使用二項式展開。 s
n=(n
−1+1
)k+s
n−1=
c0k(
n−1)
k+c1
k(n−
1)k−
1+⋯+
ckk+
sn−1
此時,如果令 x
n−1=
⎧⎩⎨⎪
⎪⎪⎪⎪
⎪(n−
1)k(
n−1)
k−1⋮
(n−1
)0sn
−1⎫⎭
⎬⎪⎪⎪
⎪⎪⎪則有 x
n=⎧⎩
⎨⎪⎪⎪
⎪⎪⎪n
knk−
1⋮n0
sn⎫⎭
⎬⎪⎪⎪
⎪⎪⎪現在的任務與剛才一樣,找到乙個係數矩陣a
,使得axn
−1=x
n ,且a
需與n
無關。 有關s
n 的遞推公式實際上就指明了a
的最後一行。而利用二項式展開很容易得到其他行。 有
a=⎧⎩
⎨⎪⎪⎪
⎪⎪⎪c
0k0⋮
0c0k
c1kc
0k−1
⋮⋯c1
k⋯⋯⋱
⋯⋯ck
kck−
1k−1
⋮c00
ckk0
0⋮01
⎫⎭⎬⎪
⎪⎪⎪⎪
⎪(3)
最後有 a
n−1x
1=xn
且 x1
=t利用該係數矩陣可以在o(
k3logn)
時間內計算出k
次方的和。
再考慮乙個一般情況:sn
=∑i=
1n(a
i+b)
k與剛才幾乎一模一樣,有 s
n=[a
(n−1
)+(a
+b)]
k+sn
−1=c
0kak
(n−1
)k+c
1kak
−1(a
+b)(
n−1)
k−1+
⋯+ck
k(a+
b)k+
sn−1
剩下的步驟,也幾乎完全與之前的一樣,令 x
n−1=
⎧⎩⎨⎪
⎪⎪⎪⎪
⎪(n−
1)k(
n−1)
k−1⋮
(n−1
)0sn
−1⎫⎭
⎬⎪⎪⎪
⎪⎪⎪則
xn=⎧⎩⎨⎪
⎪⎪⎪⎪
⎪nkn
k−1⋮
n0sn
⎫⎭⎬⎪
⎪⎪⎪⎪
⎪同樣,有關sn
的遞推公式實際上就指明了a
的最後一行,其他行則利用二項式展開得到。 有
a=⎧⎩
⎨⎪⎪⎪
⎪⎪⎪c
0k0⋮
0c0k
akc1
kc0k
−1⋮⋯
c1ka
k−1(
a+b)
⋯⋯⋱⋯
⋯ckk
ck−1
k−1⋮
c00c
kk(a
+b)k
00⋮0
1⎫⎭⎬
⎪⎪⎪⎪
⎪⎪(4)假設要計算如下和式: sn
=∑i=
1nik
ki同樣,將其寫成遞推公式,有 s
n=nk
kn+s
n−1=
(n−1
+1)k
k(n−
1)+1
+sn−
1=c0
k(n−
1)kk
(n−1
)+1+
c1k(
n−1)
k−1k
(n−1
)+1+
⋯+ck
kk(n
−1)+
1+sn
−1將與n
有關的項抽出來作為列向量,令 x
n−1=
⎧⎩⎨⎪
⎪⎪⎪⎪
⎪(n−
1)kk
(n−1
)+1(
n−1)
k−1k
(n−1
)+1⋮
(n−1
)0k(
n−1)
+1sn
−1⎫⎭
⎬⎪⎪⎪
⎪⎪⎪則
xn=⎧⎩⎨⎪
⎪⎪⎪⎪
⎪nkk
n+1n
k−1k
n+1⋮
n0kn
+1sn
⎫⎭⎬⎪
⎪⎪⎪⎪
⎪同樣,有關sn
的遞推公式說明了係數矩陣
a 的最後一行。而其他行仍然可以由二項式展開得到,只是相差了乙個係數
k 而已,這很容易解決。
最後,有 a=
⎧⎩⎨⎪
⎪⎪⎪⎪
⎪kc0
k0⋮0
c0kk
c1kk
c0k−
1⋮⋯c
1k⋯⋯
⋱⋯⋯k
ckkk
ck−1
k−1⋮
kc00
ckk0
0⋮01
⎫⎭⎬⎪
⎪⎪⎪⎪
⎪(5)
poj3070利用了矩陣1,hdu3369利用了矩陣3和4,hdu3483利用了矩陣5。
矩陣快速冪 矩陣構造
fibonacci數列 f 0 1 f 1 1 f n f n 1 f n 2 我們以前快速求fibonacci數列第n項的方法是 構造常係數矩陣 一 fibonacci數列f n f n 1 f n 2 f 1 f 2 1的第n項快速求法 不考慮高精度 解法 考慮1 2的矩陣 f n 2 f n ...
矩陣快速冪的構造
參考部落格 a i a i 1 b i 1 1,b i 2 a i 1 5 a 1 1,b 1 1,問a x b x 很簡單的遞推,一步步推即可,但是,如果x是10 9,如何推?思維 遞推式可以化為矩陣乘積 那麼,矩陣a i a i 1 b a i 1 a i b a i 1 bb a x a 1 ...
矩陣快速冪 構造方法
與快速冪一樣,可以將遞推式通過二進位制的方式來進行優化,這個學了快速冪就是十分容易理解 大概的板子如下 struct mat 自己定義大小的矩陣 mat mulmat mat a,mat b 兩個矩陣相乘 return ans 最後的矩陣,答案 int main 這個與快速冪寫法略有不同,主要是因為...