三 矩陣快速冪應用

2022-05-10 20:30:43 字數 865 閱讀 1425

這個同學寫的太好了,於是我又厚顏無恥的借鑑了

例一:poj 3070

題目:斐波那契數列f(n),給乙個n,求f(n)%10000,n<=1e9;

(這題是可以用fibo的迴圈節去做的,不過這裡不講,反正是水題)

矩陣快速冪是用來求解遞推式的,所以第一步先要列出遞推式:

f(n)=f(n-1)+f(n-2)

第二步是建立矩陣遞推式,找到轉移矩陣:

,將其一 一對應的簡寫成:

t   * a(n-1)=  a(n)

這裡就是個矩陣乘法等式左邊:1*f(n-1)+1*f(n-2)=f(n);1*f(n-1)+0*f(n-2)=f(n-1);

這裡還是說一下構建矩陣遞推的大致套路,一般an與a(n-1)都是按照原始遞推式來構建的,當然可以先猜乙個an,主要是利用矩陣乘法湊出矩陣t,第一行一般就是遞推式,後面的行就是不需要的項就讓與其的相乘係數為0。矩陣t就叫做轉移矩陣(一定要是常數矩陣),它能把a(n-1)轉移到a(n);然後這就是個等比數列,直接寫出通項:

此處a1叫初始矩陣。所以用一下矩陣快速冪求出t^(n-1)然後乘上初始矩陣就能得到an,這裡an就兩個元素(上下兩個位置),根據自己設定的a(n)對應位置就是對應的值,按照上一節矩陣快速冪寫法,pow(t,n-1)之後,res[1][1]就是結果了。

給一些簡單的遞推式

1.f(n)=a*f(n-1)+b*f(n-2)+c;(a,b,c是常數)

2.f(n)=c^n-f(n-1) ;(c是常數)

繼續例題二:poj 3233

矩陣 快速冪及應用

一 快速冪部分 求a b,如下。include using namespace std int quickpow int x,int y return ans int main 其中 位移運算,就是把y轉換為 二進位制數 整體向右移一位,高位補零,最低位消失,通常右移一位就等價於y除以2再賦給b。可...

快速冪(矩陣快速冪)

求 3 0 3 1 3 n mod 1000000007 input 輸入乙個數n 0 n 10 9 output 輸出 計算結果 sample input 3sample output 40 分析 利用等比數列的求和公式得所求和是 3 n 1 1 2,如果暴力求3 n 1 會超時,這裡引入快速冪來...

快速冪 矩陣快速冪

快速冪 正常情況下求乙個數的冪時間複雜度為o n 而快速冪能把時間複雜度降到o logn 舉個例子 求5的13次方 思想首先把13化為二進位制 1101,即13 1101 8 1 4 1 2 0 1 1 即5 13 58 1 54 1 52 0 5 1 15 5 8 1 5 4 1 5 2 0 5 ...