演算法手記之快速冪

2021-08-31 09:50:29 字數 1449 閱讀 5906

快速冪是一種快速求出 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內的非負整數。所謂的快速冪,實際上...