快速冪 與 快速乘

2021-09-26 00:22:14 字數 919 閱讀 9597

快速冪:

傳統求a^b非常的耗時間,那麼有沒有一種更快的方法去求這個呢

下面介紹一次快速冪:

以求a的b次方來介紹

把b轉換成二進位制數

以a^11為例:

b的二進位制數為1011,二進位制從右向左算,但乘出來的順序是 a(20)*a(21)*a(23),是從左向右的。我們不斷的讓base *= base目的是累乘,以便隨時對ans做出貢獻。

要理解base *= base這一步:因為base * base == base ^ 2,下一步再乘,就是(base ^ 2) * (base ^ 2) == base ^ 4,然後同理(base ^ 4) * (base ^ 4) == base ^ 8,由此可以做到base → base ^ 2 → base ^ 4 → base ^ 8 → base ^ 16 → base ^ 32…指數正好是 2 ^ i 。再看上面的例子,a¹¹= (a ^ 1) * (a ^ 2) * (a ^ 8),這三項就可以完美解決了,快速冪就是這樣。

**:

long

long

ksm(

long

long a,

long

long b)

base *

= base;

b >>=1;

}return ans;

}

快速乘

快速乘與快速冪的思想基本一致,都是把b轉化為二進位制,ab轉化為多個式子相加的形式,在計算機中加法運算不乘法運算快。*

當ab的計算結果爆出long long的範圍是,可以用快速乘來求解,不僅降低時間複雜度,而且節省空間。

inline ll mult_mod

(ll a, ll b, ll m)

return res;

}

快速冪與快速乘

題目描述 求 a 的 b 次方對 p 取模的值,其中 0 a,b 10 9 0輸入 三個用空格隔開的整數a,b和p。輸出 乙個整數,表示a b mod p的值。樣例輸入 2 3 9 樣例輸出8思路 普通求冪時間複雜度為o b 會tle 設b的二進位制表示有k位,ci為0或1,則 b sum limi...

快速冪 快速乘

直接求解,需要迴圈b次。思路 將b轉化為二進位制。對應為1的次數的冪保留,只需要將保留的冪的結果進行乘積就是a b。class solution def fast self,a,b b bin b 2 res 1for i in b 1 if i 1 res res a a a return res...

快速乘,快速冪

老是忘記還是寫下來記錄一下 快速乘,和快速冪都是防止爆int,或long long,如果爆longlong可以選擇兩者結合,或者使用 int128 上網搜了還是不懂 例題 include iostream using namespace std int main b b 2 a a a m cout...