根据二进制来求,优化成 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;
}