快速冪 快速乘

2022-04-29 06:45:08 字數 752 閱讀 2067

快速冪等演算法都是基於二進位制優化的演算法,本文不做過多敘述,在此只是留下模板,並介紹\(o(1)\)快速乘

int qpow(int a, int b, int p)
#define qword long long

qword qmul(qword a, qword b, qword p)

利用 \(a * b \pmod p = a * b - [a * b / p] * p\)

首先 $ a,b < p $ 時, $ a * b / p $ 一定小於 $ p $ ,我們可以用浮點數進行 $ a * b / p $ 的運算,而不用關心小數點後面的部分。浮點型別long double在十進位制下可以儲存 $ 18~19 $ 位。

當浮點數的精度不足以保證位數時,它會以科學記數法捨棄低位,這並不會影響我們需要的整數部分的運算

另外,雖然 $ a * b $ 和 $ a * b / p $ 可能很大,但是二者的差一定在 $ 0 ~ p-1 $ 之間,我們只關心它們的較低位數就可以,所以,我們用long long儲存 $a * b $ 和 $ [a * b / p] * p $ 各自的結果,整數溢位相當於捨棄最高位,也正好符合我們的要求

#define qword long long

qword mul(qword a, qword b, qword p)

快速冪 快速乘

直接求解,需要迴圈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...

快速乘 快速冪(矩陣快速冪)

當mod乙個大數p的時候,還有進行乘法的時候可能會爆long long的時候,就用快速乘或者快速冪。參考 先上模板 快速乘 ll multi ll a,ll b,ll m return ans 快速冪 ll pow mod ll a,ll b,ll m return res 快速乘 快速冪 hdu題...