與快速冪一樣,可以將遞推式通過二進位制的方式來進行優化,這個學了快速冪就是十分容易理解
大概的板子如下:
struct mat///自己定義大小的矩陣
;mat mulmat(mat a,mat b)///兩個矩陣相乘
return ans;///最後的矩陣,答案
}int main()
這個與快速冪寫法略有不同,主要是因為矩陣快速冪需要自己構造你的變換函式,而快速冪的a僅僅是乙個底數。
構造矩陣快速冪的方法是這種題的重要難點:
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-1]】。根據fibonacci數列的遞推關係,我們可以通過乘以乙個2×2的矩陣a,得到矩陣:【f[n-1],f[n]】。
即:【f[n-2],f[n-1]】*a = 【f[n-1],f[n]】=【f[n-1],f[n-1]+f[n-2]】
很容易構造出這個2×2矩陣a,即:
0 1
1 1所以,有【f[1],f[2]】×a=【f[2],f[3]】
又因為矩陣乘法滿足結合律,故有:
【f[1],f[2]】×a ^(n-1) =【f[n],f[n+1]】
這個矩陣的第乙個元素f[n]即為所求。
(二) 數列f[n]=f[n-1]+f[n-2]+1,f[1]=f[2]=1的第n項的快速求法(不考慮高精度)
解法:仿照前例,考慮1×3的矩陣【f[n-2],f[n-1],1】,希望求得某3×3的矩陣a,使得此1×3的矩陣乘以a得到矩陣:【f[n-1],f[n],1】
即:【f[n-2],f[n-1],1】* a =【f[n-1],f[n],1】=【f[n-1],f[n-1]+f[n-2]+1,1】
容易構造出這個3×3的矩陣a,即:
0 1 0
1 1 0
0 1 1
故:【f[1],f[2],1】* a^(n-1) = 【f[n],f[n+1],1】
(三)數列f[n]=f[n-1]+f[n-2]+n+1,f[1]=f[2]=1的第n項的快速求法(不考慮高精度).
解法:仿照前例,考慮1×4的矩陣【f[n-2],f[n-1],n,1】,希望求得某4×4的矩陣a,使得此1×4的矩陣乘以a得到矩陣:【f[n-1],f[n],n+1,1】
即:【f[n-2],f[n-1],n,1】* a = 【f[n-1],f[n],n+1,1】=【f[n-1],f[n-1]+f[n-2]+n+1,n+1,1】
容易構造出這個4×4的矩陣a,即:
0 1 0 0
1 1 0 0
0 1 1 0
0 1 1 1
故:【f[1],f[2],3,1】* a^(n-1) = 【f[n],f[n+1],n+2,1】
(四) 數列f[n]=f[n-1]+f[n-2],f[1]=f[2]=1的前n項和s[n]=f[1]+f[2]+……+f[n]的快速求法(不考慮高精度).
解法:仿照之前的思路,考慮1×3的矩陣【f[n-2],f[n-1],s[n-2]】,我們希望通過乘以乙個3×3的矩陣a,得到1×3的矩陣:【f[n-1],f[n],s[n-1]】
即:【f[n-2],f[n-1],s[n-2]】 * a = 【f[n-1],f[n],s[n-1]】=【f[n-1],f[n-1]+f[n-2],s[n-2]+f[n-1]】
容易得到這個3×3的矩陣a是:
0 1 0
1 1 1
0 0 1
這種方法的矩陣規模是(r+1)*(r+1)
f(1)=f(2)=s(1)=1 ,所以,有
【f(1),f(2),s(1)】* a = 【f(2),f(3),s(2)】
故:【f(1),f(2),s(1)】* a^(n-1) = 【f(n),f(n+1),s(n)】
(五) 數列f[n]=f[n-1]+f[n-2]+n+1,f[1]=f[2]=1的前n項和s[n]=f[1]+f[2]+……+f[n]的快速求法(不考慮高精度).
解法:考慮1×5的矩陣【f[n-2],f[n-1],s[n-2],n,1】,
我們需要找到乙個5×5的矩陣a,使得它乘以a得到如下1×5的矩陣【f[n-1],f[n],s[n-1],n+1,1】
即:【f[n-2],f[n-1],s[n-2],n,1】* a =【f[n-1],f[n],s[n-1],n+1,1】
=【f[n-1], f[n-1]+f[n-2]+n+1,s[n-2]+f[n-1],n+1,1】
容易構造出a為:
0 1 0 0 0
1 1 1 0 0
0 0 1 0 0
0 1 0 1 0
0 1 0 1 1
故:【f(1),f(2),s(1),3,1】* a^(n-1) = 【f(n),f(n+1),s(n),n+2,1】
一般地,如果有f[n]=p*f[n-1]+q*f[n-2]+r*n+s
可以構造矩陣a為:
0 q 0 0 0
1 p 1 0 0
0 0 1 0 0
0 r 0 1 0
0 s 0 1 1
更一般的,對於f[n]=sigma(a[n-i]*f[n-i])+poly(n),其中0例如:a(0) = 1 , a(1) = 1 , a(n) = x * a(n - 1) + y * a(n - 2) (n >= 2);給定三個值n,x,y求s(n):s(n) = a(0)2 +a(1)2+……+a(n)2。
解:考慮1*4 的矩陣【s[n-2],a[n-1]^2,a[n-2]^2,a[n-1]*a[n-2]】
我們需要找到乙個4×4的矩陣a,使得它乘以a得到1×4的矩陣
【s[n-1],a[n]^2,a[n-1]^2,a[n]*a[n-1]】
即:【s[n-2],a[n-1]^2,a[n-2]^2,a[n-1]*a[n-2]】* a = 【s[n-1],a[n]^2,a[n-1]^2,a[n]*a[n-1]】
= 【s[n-2]+a[n-1]^2 , x^2 * a[n-1]^2 + y^2 * a[n-2]^2 + 2*x*y*a[n-1]*a[n-2] ,
a[n-1]^2 , x*a[n-1]^2 + y*a[n-2]a[n-1]】
可以構造矩陣a為:
1 0 0 0
1 x^2 1 x
0 y^2 0 0
0 2xy 0 y
故:【s[0],a[1]^2,a[0]^2,a[1]*a[0]】 * a^(n-1) = 【s[n-1],a[n]^2,a[n-1]^2,a[n]*a[n-1]】
所以:【s[0],a[1]^2,a[0]^2,a[1]*a[0]】 * a^(n) = 【s[n],a[n+1]^2,a[n]^2,a[n+1]*a[n]】
若a = (b * c ) 則at = ( b * c )t = ct * bt
矩陣快速冪 矩陣構造
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 ...
矩陣構造 矩陣快速冪 HDU5950
題目 題意 給出公式f n f n 1 f n 2 2 n 4 給出n f 1 f 2 求f n 分析 快速冪 把公式分解一下,求一下矩陣,矩陣快速冪搞一下就好 題目的難點在於矩陣的構造題解 典型的矩陣快速冪的運用。關鍵是i 4怎麼維護?我們可以當成求第i 1項,那麼i 4就變成了 i 1 4。那麼...