ACM模板 位運算,(矩陣)快速冪

2021-10-02 02:21:09 字數 2119 閱讀 5202

為什麼要有快速冪運算,因為對於c++來說,pow函式在函式庫中的定義之中是通過連續相乘得到的結果,那麼對於一些小的冪來說,計算確實很快,但是當冪達到1e8往上這些大的冪來說的話,時間複雜度太大,過於耗時,所以採用了快速冪的演算法,來提高運算的速度,對於221

002^

2210

0來說,普通演算法要運算2100

2^100

2100

次,而採用快速冪演算法的話,只需要運算100次,也就是時間複雜度是o(logn),原本的時間複雜度是o(n)級別的;

具體原理:

對於想要求得的乙個b

yb^y

by,我們可以把y化成二級制的科學計數法,也就是y=a

n2cn

+..+

a12c

1+a0

y=a_n2^+..+a_12^+a_0

y=an​2

cn​+

..+a

1​2c

1​+a

0​,然後對於原式來說,就變成了by=

ban2

cn+.

.+a1

2c1+

a0=b

an2c

n∗..

.∗ba

12c1

∗ba0

b^y=b^+..+a_12^+a_0}=b^}*...*b^}*b^

by=ban

​2cn

​+..

+a1​

2c1​

+a0​

=ban

​2cn

​∗..

.∗ba

1​2c

1​∗b

a0​

怎麼求得每乙個的結果呢?

我們觀察得出,對於二進位制的科學計數法來說,a

ia_i

ai​要麼是0,要麼是1,0、1與c

ic_i

ci​有關,而c

ic_i

ci​又恰好是二進位制的位置索引,舉個例子:如5,化為二進位制101,化為科學計數法:5=1

∗22+

0∗21

+1∗2

05=1*2^2+0*2^1+1*2^0

5=1∗22

+0∗2

1+1∗

20所以對於bai

2c

ib^}

bai​2c

i​來說,我們只需要知道y對應的二進位制數,就可以知道a與c的每乙個值,也就可以知道每乙個結果;

**實現:

#include using namespace std;

#define ll long long //long long 型別,這裡相當於把long long定義了乙個別名;

//為什麼用longlong型別?因為對於乙個快速冪來說,運算的結果很有可能是乙個大於int型別所能處理的數

//b代表底數,y代表冪

ll quickpow(ll b, ll y)

//我們最終想要的結果

return res;

}int main()

矩陣快速冪:

和上面的差不多,主要是多了乙個矩陣乘法的問題;具體看**吧

#include using namespace std;

#define ll long long //定義別名

//maxx是矩陣的最大行數,maxy則是矩陣的最大列數

const int maxx = 100;

const int maxy = 100;

//用結構體來表示矩陣

struct matrix

;//矩陣的乘法法則,ax代表a的行數,ay則是a的列數

matrix mul(matrix a, matrix b, int ax, int ay, int by)}}

return res;

}//b的n次方,lenb代表著b的行數

matrix quickpow(matrix b, ll n, int lenb)

}//中間變數

matrix tmp=b;

while(n)

return res;

}int main()

cout<}

}

矩陣快速冪模板

剛學了矩陣快速冪,花了點時間把之前的 修改一下寫成了矩陣類,就當做模板了.話不多說下面貼 首先是標頭檔案和巨集定義什麼的 include include include using namespace std define inf 1000000000 define maxm 20 define m...

矩陣快速冪模板

矩陣快速冪 o log n nyoj301 580ms 時間限制 1000 ms 記憶體限制 65535 kb 難度 4 描述 給你乙個遞推公式 f x a f x 2 b f x 1 c 並給你f 1 f 2 的值,請求出f n 的值,由於f n 的值可能過大,求出f n 對1000007取模後的...

矩陣快速冪模板

struct mat mat operator const mat c return res 上面是我的基本矩陣快速冪模板,其實矩陣快速冪難的不是你怎麼寫,難的是你矩陣怎麼構造。矩陣的構造,就是找遞推關係。要把需要用到的遞推關係包含操作矩陣上去。找到合適的初始向量和合適的操作矩陣,你基本就可以完成題...