快速冪是一種快速求出 ab 的值的演算法,複雜度為o(logn),而一般的樸素演算法是由乙個for迴圈慢慢算,算完需要o(n)的時間,這顯然不符合yxh老師高山流水般的思路,所以我們需要乙個高效的演算法來解決這個問題。
快速冪的原理
假設要求211的值,指數11可以使用二進位制的形式寫成11=20+21+23,所以211能表示為220
+21+
23
2^+2^+2^}
220+21
+23,將冪指數拆分就變成了:220
∗221
∗223
2 ^}*2^}*2^}
220∗22
1∗22
3。這樣,對於整個值的計算只需要進行3個數的乘積,累計執行3次,是不是很神奇?
這個時候,聰明的同學可能就會看出乙個問題,對於每乙個a2k
a^}a2
k如何處理?很顯然,既然都用到二進位制了,為什麼不問問神奇海螺用位運算呢?
在這裡我們要用到&以及>>這兩個位運算子
運算子&通常用於提取乙個二進位制數的末尾,就是a&1
當然,因為二進位制數末尾只可能是1或0,所以還可以用來判斷乙個數的奇偶性
而》運算就是把二進位制數末尾的那個數字去掉
接下來先看**
#
define
lllong
long
intll quick_exp
(ll a,ll b,
int mod)
return ans;
}
其中最精髓的部分就是a=(
a∗a)
a=(a*a)
a=(a∗a
)這裡,利用這樣乙個累乘器來表示二進位制數每一位對應的十進位制數
a ∗a
=a2=
a2
1a*a=a^2=a^}
a∗a=a2
=a21
a
2a^2
a2—>a2∗
a2=a
4=a2
2a^*a^=a^4=a^}
a2∗a2=
a4=a
22a
4a^4
a4—>a4∗
a4=a
8=a2
3a^*a^=a^8=a^}
a4∗a4=
a8=a
23a
8a^8
a8—>……
然後取一下每一位上的值(0或1)來確定要不要乘到ans上去就ok了
C 演算法之 快速冪
快速冪 quick power,以下簡稱qpw 是math.h或cmath裡的內建函式pow的公升級版 只不過是比pow快了一些 qpw函式需要實現以下的條件 宣告ans變數,賦值為1 如果指數為奇數,ans乘上原數 原數 原數的平方,指數除以2 如果b 0,返回ans,否則重複執行2,3步 注意取...
初學演算法之快速冪
目前遇到需要用快速冪的題,大多都是與取模有關且直接乘會爆資料的題。因此,在講快速冪之前,我們得先了解下取模運算。基本性質 若p a b 則a b p 例如 11 4 7 18 4 7 a p b p 意味a b p 對稱性 a b p 等價於b a p 傳遞性 若a b p 且b c p 則a c ...
演算法提高快速冪(快速冪演算法詳解)
問題描述 給定a,b,p,求 a b mod p。輸入格式 輸入共一行。第一行有三個數,n,m,p。輸出格式 輸出共一行,表示所求。樣例輸入 2 5 3 樣例輸出 資料規模和約定 共10組資料 對100 的資料,a,b為long long範圍內的非負整數,p為int內的非負整數。所謂的快速冪,實際上...