快速冪 矩陣快速冪入門(舉列斐波數列)

2021-08-22 05:54:12 字數 3002 閱讀 1219

計算a的b次冪對c取模!

我們能想到的就是暴力;

迴圈b次,每次乘以a就得到了答案;

但是如果b的值很大呢?這種o(n)的演算法就太慢了!

下面-快速冪上場

首先了解一下下面這兩個公式

接下來先直接給你們貼**

int powermod(int a, int b, int c)//計算a的b次冪對c取模(複雜度lgb)

return ans;

}是不是很神奇?為什麼就變成了logn複雜度呢?其實關鍵在於b=b/2;為什麼要這樣寫呢??我舉個例子

我們要計算2^8,按照先前的演算法我們需要迴圈8次。快速冪就是:計算2的4次冪可以由2的2次冪乘以2的2次冪,八次冪就是由二的四次冪乘以二的四次冪!!!!!!(懂了嗎兄弟???當你數字很大的時候就是奇效!!你可以用手寫乙個很大的數按照快速冪演算法算一下  複雜度不高的  一定要試試你才會體會到快速冪的奧妙)

好難理解啊。。。好吧不嚇唬你,其實入門還是很簡單的!!

首先你需要有點線代基礎知識!!(既然我寫出來了我就給你來點矩陣快速冪需要的線代基礎知識)

矩陣是什麼你應該知道!!對!你肯定知道!我不會告訴你矩陣就是乙個二維陣列只是他有自己的一套運算規律

加減都是位置對應得的一項直接相加減

乘法如下(不一樣)

舉例:a、b均為3*3的矩陣:c=a*b,下面的**會涉及到兩種運算順序,第一種就是直接一步到位求,第二種就是每次求一列,比如第一次,c00+=a00*b00,c01+=a00*b01……第二次c00+=a00*b10,c01+=a01*b11……以此類推。。。

c00 = a00*b00 + a01*b10 + a02*b20
c01 = a00*b01 + a01*b11 + a02*b21
c02 = a00*b02 + a01*b12 + a02*b22
c10 = a10*b00 + a11*b10 + a12*b20
c11 = a10*b00 + a11*b11 + a12*b21
c12 = a10*b02 + a11*b12 + a12*b22
c20 = a20*b00 + a21*b10 + a22*b20
c21 = a20*b01 + a21*b11 + a22*b21
c22 = a20*b02 + a21*b12 + a22*b22
c00 = a00*b00 + a01*b10 + a02*b2

c01 = a00*b01 + a01*b11 + a02*b21 

c02 = a00*b02 + a01*b12 + a02*b22

(注釋一下ab是矩陣a和矩陣b相乘,a是a的元素,aij是位置【i,j】的值,b自己模擬)

好了下面那開始講解矩陣快速冪(僅僅入門  難點的我做個幾十道題了再發出來)

首先你要構造乙個單位的矩陣(我也不知道怎麼構造,因為這個沒有板子,只能靠題目來構造,這個是我覺得矩陣快速冪唯二難得地方)

單位矩陣: n*n的矩陣 mat ( i , i )=1; 任何乙個矩陣乘以單位矩陣就是它本身 n*單位矩陣=n, 可以把單位矩陣等價為整數1。(單位矩陣用在矩陣快速冪中)

7*7的單位矩陣

快速冪的思路就是:

設a為矩陣,求a的n次方,n很大,隨便你怎麼大1000000好吧。

先看小一點的,a的9次方

a^9

= a*a*a*a*a*a*a*a*a  【乙個乙個乘,要乘9次】

= a*(a*a)*(a*a)*(a*a)*(a*a)【保持格式的上下統一,所以加上這句】

= a*(a^2)^4 【a平方後,再四次方,還要乘上剩下的乙個a,要乘6次】

= a*((a^2)^2)^2【a平方後,再平方,再平方,還要乘上剩下的乙個a,要乘4次】

也算是一種二分思想的應用吧,1000000次冪,暴力要乘1000000次,快速冪就只要(log2底1000000的對數) 次。懂了嗎??你肯定都懂!!

好了對於斐波數列(別tm給我說你不知道這個數列)我就直接上**了(**上有很詳細的解釋)

#include///我圖省事才寫的萬能標頭檔案(不建議,做題多一點的都知道有的oj打不開)

using namespace std;

typedef long long ll;

const int mod=10000;

struct mat

;mat mat_mul(mat x,mat y)///矩陣相乘返回乙個矩陣

///求乙個矩陣n次冪(參照求n的m次冪一樣)

void mat_pow(int n)

printf("%i64d\n",res.a[0][1]);

}int main()

return 0;

}我知道你肯定想知道為什麼要單位矩陣啊??為什麼

我告訴你,因為他是多維的!

給你擺乙個東西你自己體會一下

好了  你肯定懂了  bb!

快速冪(矩陣快速冪)

求 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 ...

快速冪 矩陣快速冪

快速冪 我們求a ba b ab最直接的方法就是把a乘b次這樣的話複雜度就是o n o n o n 但是在比賽時面對1e9的資料時還是會輕鬆超時的,此時就需要一種更快的乘法來幫助我們 我們把b拆成二進位制的形式得到a ba b ab a 10.01 a a1 0.01此時對b分解得到的序列10.01...