快速冪 思想及程式碼
阿新 • • 發佈:2021-02-05
技術標籤:學習筆記
根據二進位制來求,優化成 O ( l o g N ) O(logN) O(logN)
比如
2
10
2^{10}
210,10
的二進位制是1010
,也就是說
2
10
=
2
101
0
2
=
2
2
3
∗
2
2
1
2^{10} = 2^{1010_2} = 2^{2^3} * 2^{2^1}
210=210102=223∗221
發現:將10
的二進位制1010
從後向前看,如果遇到1
就乘到答案上
而base
是代表二進位制中k
位的:
a
k
a^k
ak, 承接上一句,如果遇到1
就把**$a^k$
乘到答案**上
#include <iostream>
using namespace std;
int f(int a, int b, int mod)
{
int ans = 1;
int base = a;
while (b)
{
if (b & 1) // 看是否該乘到答案
ans = (ans * base) % mod;
base = (base * base); // a的k次冪
b >>= 1; // 將b看完
}
return ans % mod;
}
int main()
{
int a, b, mod;
cin >> a >> b >> mod;
cout << f(a, b, mod);
return 0;
}