快速冪與快速乘

2022-07-10 12:57:15 字數 1196 閱讀 3850

題目描述

求 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\limits_^ c_i*2^i

\]\[a^b = a^^ c_i*2^i} = \prod_^a^*2^i} = \prod_^)}^\]而

\[a^ = a^}*a^}

\]所以計算k-1次就可以求出答案,時間複雜度優化到o(logb)

還可以用遞迴的思想

\[a^b = \left\

& a^*a^ &(b為偶數) \\

& a^2}*a^2}*a& (b為奇數)\\

\end

\right.

\]**

非遞迴寫法

#includeusing namespace std;

typedef long long ll;

ll quick_power(ll a, ll b, ll p)

return ans;

}int main()

int main()^ c_i*2^i

a*b = a*\sum\limits_^ c_i*2^i = \sum\limits_^ c_i*(a*2^i)\]而

\[a*2^i = a*2^*2

\]同樣也可以用遞迴的思想

\[a*b = \left\

& a* + a*&(b為偶數) \\

& a*2} + a*2}+a& (b為奇數)\\

\end

\right.

\]**

非遞迴寫法

#includeusing namespace std;

typedef long long ll;

ll quick_mul(ll a, ll b, ll p)

return ans;

}int main()

int main()

快速冪 與 快速乘

快速冪 傳統求a b非常的耗時間,那麼有沒有一種更快的方法去求這個呢 下面介紹一次快速冪 以求a的b次方來介紹 把b轉換成二進位制數 以a 11為例 b的二進位制數為1011,二進位制從右向左算,但乘出來的順序是 a 20 a 21 a 23 是從左向右的。我們不斷的讓base base目的是累乘,...

快速冪 快速乘

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