矩陣快速冪 遞推題的快速計算

2021-07-05 15:24:47 字數 1108 閱讀 7369

昨天晚上矩陣小王子給我們講了一下矩陣快速冪,學習了一下,寫了乙個模板。

ps:原創鏈結

1:思想

矩陣快速冪的思想就是跟數的快速冪一樣,假如我們要求2^11,次方,我們可以把 11 寫成 1+2+8 ,也就是2^0 + 2^1 + 2^3 。那麼把乙個o(n)的時間複雜度降到了log(n)

矩陣快速冪的思想和數的快速冪是一模一樣的,就是要自己實現矩陣的乘法,然後可以套數的快速冪的模板。

2:難點

矩陣題目的難點在於構造矩陣,一般用於有能夠推出遞推式的題目,推出遞推式之後,發現遞推o(n)的複雜度時間比較大,那麼我們可以構造乙個矩陣,然後用矩陣快速冪降低到log(n)的時間複雜度

比如說nyoj 301

給出這樣乙個遞推式

f(x)=a*f(x-2)+b*f(x-1)+c

然後求f(n),n為10^9

這樣直接遍歷的時間複雜度肯定是不允許的那麼我們就想辦法構造乙個矩陣]

| a , 1 , 0|   | a , 1 , 0|^(n-2)

|f(n) , f(n-1) ,1 

| = | f

(n-1) , f(n-2) ,1

| *  | b , 0 , 0| = | f2 ,f1 , 1| *

| b , 0 , 0|

|c , 0 , 1 |            |c , 0 , 1 |

那麼我們就可以直接用矩陣快冪了。

快速冪模板:

code

#include #include #include #include using namespace std;

const long long m = 1000007;

const long long n = 3;

long long t,b,c,f1,f2;

struct node //矩陣

};node isit(node x,long long c) //矩陣初始化

tmp=matlab(tmp,tmp);

n/=2;

}return ans.a[0][0];

}int main()

return 0;

}

快速冪計算(整數快速冪 矩陣快速冪)

快速冪計算 樸素演算法實現 1 ll get pow ll x,ll n 這裡的n要求不小於0,如果n小於0則令n n,並且最終返回1.0 ans即可 29 return ans 10 快速冪演算法 原理 二分 假設我們現在要計算pow x,n 那麼有當n為偶數時pow x,n pow x x,n ...

藍橋杯 遞推求值(快速冪,矩陣快速冪)

快速冪就是快速計算m n 快 主要體現在它把複雜度從一般迴圈計算的o n 級別降低到了o logn 級別。一般情況下,m n m m m m,實現就是用一般的迴圈計算來實現。而快速冪的想法是將m n表示成m 2 a1 2 a2 2 a1 2 a2 n 我們現在假設n 10 一般想法就是將m乘以10次...

矩陣快速冪優化遞推式

文章原位址 第一行第一列元素為第乙個矩陣的第一行的每個元素和第二個矩陣的第一列的每個元素乘積的和 以此類推 第i行第j列的元素就是第乙個矩陣的第i行的每個元素與第二個矩陣第j列的每個元素的乘積的和。單位矩陣 n n的矩陣 mat i i 1 任何乙個矩陣乘以單位矩陣就是它本身 n 單位矩陣 n,可以...