使用一般方法來計算x
nx^n
xn需要計算n
nn次,而快速冪就是一種只需要計算log
2(n)
log_2(n)
log2(
n)次就可以計算出x
nx^n
xn的演算法。
1.n an
b=na
+b
n^an^b=n^
nanb=n
a+b(容易得很,是八年級數學內容吧)
2.二進位制:假設n=(
10)
10n=(10)_
n=(10)
10,那麼n=(
1010)2
=23+
21
n=(1010)_=2^3+2^1
n=(101
0)2
=23+
21,所以x10=
x23×
x2
1x^=x^×x^
x10=x2
3×x2
1。3.位運算:這裡主要用到三種:&(按位與)、|(按位或)和》(右移)。
&:按位與
將參與運算的兩個數的二進位制位對應,當對應的兩個位均為1時,結果的對應位才為1,否則為0。9&
5相當於1001
&0101,結果為0001,即1。
十進位制 二進位制9=
10015=
01019&
5=0001
|:按位或
將參與運算的兩個數的二進位制位對應,對應的兩個位有乙個為1,結果的對應位就為1,否則為0。9|
5相當於1001
|0101,結果為1101,即13。
十進位制 二進位制9=
10015=
01019|
5=1101
>>:右移
a>>b即將a的各二進位制位向右移b位。
設a=15
,b=2
,a>>b表示把1111右移2位,結果為0011,即3。
(以下為詳細解釋,可以不看)
假設n =11
n=11
n=11
,求x
nx^n
xn定義乙個t=x
t=xt=
x,表示x
xx的方
定義乙個ans
=1
ans=1
ans=
1,用來存答案
第一輪迴圈
while
(n>0)
第二輪迴圈
0101最後一位是1,說明x^
2存在,ans乘上x^
2。t自乘,變為x^
4.n右移,變為0010
第三輪迴圈
0010最後一位是0,說明x^
4不存在,於是不進行操作。
t自乘,變為x^
8n右移,變為0001
第四輪迴圈
0001最後一位是1,說明x^
8存在,ans乘上x^
8。t自乘,變為x^
16.n右移,變為0000
n=0
n=0n=
0,華麗結束。
快速冪經常要與取餘運算相結合,這裡也要介紹一下。
取餘運算(%)有幾個性質:
1.( a+
b)
(a+b)
(a+b)%mmm=
(a
=(a=(
a%m+
bm+b
m+b%m)m)
m)%m
mm2.(a×
b)
(a×b)
(a×b)%mmm=
((
a=((a
=((a
%m )×
(b
m)×(b
m)×(b%m))
m))m)
)%mm
m於是在快速冪中進行取餘運算可以:
while
(n>0)
t*=t;
t%=m;
//取餘
n>>=1;
}
終於結束了!
撒花!
//普通版
#include
#include
#define
llunsigned
long
long
using
namespace std;
ll x,n;
ll qpow
(ll x,ll n)
return ans;
}int
main()
//取餘運算版
#include
#include
#define
llunsigned
long
long
using
namespace std;
ll x,n,m;
ll qpow
(ll x,ll n,ll m)
t*=t;
t%=m;
n>>=1;
}return ans;
}int
main()
學習筆記 快速冪
求 m n k 快速冪 m n k int quickpow int m,int n,int k return b 快速冪,通過將n轉換成二進位制的方法優化運算。例如n 37 的時候 37 2 5 2 2 2 0 那麼m 37 k m 2 5 2 2 2 0 k m 2 5 m 2 2 m 2 0 ...
學習筆記 快速冪
定義 快速冪顧名思義,就是快速算某個數的多少次冪。其時間複雜度為 o log n 與樸素的o n 相比效率有了極大的提高。舉例 以下以求a的b次方來介紹 把b轉換成二進位制數。該二進位制數第i位的權為2 i 1 例如a 11 a 2 0 2 1 2 3 11的二進位制是1011 11 2 1 2 0...
矩陣快速冪 學習筆記
首先,我們需要了解矩陣。矩陣說白了就是一堆數,排成長方形的形狀。然後就是矩陣的運算,加減都很簡單,這裡談一下乘法 所以矩陣相乘,一定是有其中乙個矩陣的行等於另乙個矩陣的列的。矩陣快速冪則和一般的快速冪的操作是一樣的,只是把乘法變成了矩陣乘而已,就像過載那樣。這裡還要說一下單位矩陣 對於n m n m...