為什麼要有快速冪運算,因為對於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=an2
cn+
..+a
12c
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
12c
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^}
bai2c
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 上面是我的基本矩陣快速冪模板,其實矩陣快速冪難的不是你怎麼寫,難的是你矩陣怎麼構造。矩陣的構造,就是找遞推關係。要把需要用到的遞推關係包含操作矩陣上去。找到合適的初始向量和合適的操作矩陣,你基本就可以完成題...