快速冪演算法詳解

2021-08-11 14:30:34 字數 1123 閱讀 3020

/*快速冪*/

intpow

(int a,

int b)

return ans;

/*常規求冪運算*/

ll pow

(ll a, ll b)

快速冪這個東西比較好理解,理解過後會發現非常的巧妙。

快速冪的目的就是做到快速求冪,假設我們要求a^b,按照樸素演算法就是把a連乘b次,這樣一來時間複雜度是o(b)也即是o(n)級別,快速冪能做到o(logn),快了好多好多。它的原理如下:

假設我們要求ab,那麼其實b是可以拆成二進位制的,該二進位制數第i位的權為2(i-1),例如當b==11時,a11=a(20+21+2^3)

11的二進位制是1011,11 = 2³×1 + 2²×0 + 2¹×1 + 2º×1,因此,我們將a¹¹轉化為算 a(20)*a(21)a(23) ,看出來快的多了吧原來算11次,現在算三次,但是這三項貌似不好求的樣子…不急,下面會有詳細解釋。

由於是二進位制,很自然地想到用位運算這個強大的工具: & 和 >> ,&運算通常用於二進位製取位操作,例如乙個數 & 1 的結果就是取二進位制的最末位。還可以判斷奇偶x&10為偶,x&11為奇。>>運算比較單純,二進位制去掉最後一位

**很短,死記也可行,但最好還是理解一下吧,其實也很好理解,以b==11為例,b=>1011,二進位制從右向左算,但乘出來的順序是 a(20) * a(21) * a(23),是從左向右的。我們不斷的讓base=base目的即是累乘,以便隨時對ans做出貢獻。

其中要理解base*=base這一步,看:::basebase==base2,下一步再乘,就是base2base2==base4,然後同理 base^4 * base4 = base^8 , see?是不是做到了base–>base2–>base4–>base8–>base16–>base^32…指數正是 2^i 啊,再看上面的例子,a¹¹ = a(20) * a(21) * a(23),這三項是不是完美解決了,,嗯,快速冪就是這樣。

順便囉嗦一句,由於指數函式是**增長的函式,所以很有可能會爆掉int的範圍,根據題意決定是用 long long啊還是unsigned int啊還是mod某個數啊自己看著辦。

還有,矩陣快速冪的求法唯一的區別就是*換成矩陣中的乘法

演算法提高快速冪(快速冪演算法詳解)

問題描述 給定a,b,p,求 a b mod p。輸入格式 輸入共一行。第一行有三個數,n,m,p。輸出格式 輸出共一行,表示所求。樣例輸入 2 5 3 樣例輸出 資料規模和約定 共10組資料 對100 的資料,a,b為long long範圍內的非負整數,p為int內的非負整數。所謂的快速冪,實際上...

快速冪詳解

1.首先說快速冪是用處 快速冪顧名思義,就是快速算某個數的多少次冪。其時間複雜度為 o lgn 比樸素的o n 快了不知多少啊!以下以求a的b次方來介紹 2.快速冪的原理 把b轉換成2進製數 該2進製數第i位的權為a 2 i 1 例如 a 11 a 2 0 2 1 2 3 11的二進位制是1 011...

快速冪詳解

學楊輝三角的時候偶然看到了這個東西,然後應aj a j做一題寫一篇部落格的要求,我就補發了這篇部落格 若對一些概念有不懂的地方在後面坐著放入了概念補充,若需要的可以去看一下 當我們需要求出ab a b的時候,樸素的想法是直接 b b 個a role presentation style positi...