2. 板子
計算a ^ k % p
把k拆成二進位制表示形式,比如k等於5的時候,k = (101)2 = c1 * 1 + c2 * 0 + c3 * 1
預處理a ^ c1, a ^ c2, …, a ^ ct
這樣計算a^k%p時,答案即為res = (a^c1) * (a^c3)
a * (2 ^ 0) = (2 ^ 0) * a;
a * (2 ^ 1) = (2 ^ 1) * a;
a * (2 ^ 2) = (2 ^ 2) * a;
a * (2 ^ 3) = (2 ^ 3) * a;
…a * (2 ^ k) = (2 ^ k) * a , res1 = (2 ^ k) * a;
a * (2 ^ (k + 1)) = (2 ^ k + 2 ^ k) * a, res2 = (res1 + (2 ^ k)) * a;
可以看出2的(k+1)次是在2的k次的基礎上再加上2的k次
比如求 a * 13 % p = a*(1 * 1 + 2 * 0 + 4 * 1 + 8 * 1) % p
即第1為乘1,第2為乘0,第3為乘1,第4為乘1,要判斷每一位是否為1,如果為1,才需要
快速冪
ll qmi
(ll a, ll k, ll p)
return res;
}
快速乘
// 快速乘(只能計算到a = 2^18, b = 2 ^ 18)
ll qmul
(ll a, ll k, ll b)
return res;
}
快速乘和快速冪
由於計算機底層的關係,計算機在計算加的時候往往要比計算乘要快,所以我們可以用加法來實現乘法。乘法其實就是讓乘數個被乘數相加 也許可以這麼說吧 由於計算機是二進位制的,所以我們使用二進位制運算加法。快速乘的原理是乘法分配律。例如計算20 14,首先把14化成二進位制數,1110 然後就是20 0 2 ...
快速冪和快速乘
2 10 2 5 2 5 2 5 2 2 4 2 4 2 2 2 2 2 2 2 1 2 1 2 1 2 2 0 有些時候偶數的情況就只需要乘它本身就夠了,時間複雜度少了很多,這樣的話2 10只需要5步就可以求出來了,但是迴圈的話,卻需要十次。在二進位制中假如是2 10那麼10對應的二進位制就是10...
快速冪 快速乘
直接求解,需要迴圈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...