//CH0101 2020/10/7 20:22
#include <bits/stdc++.h>
using namespace std;
int a, b, p;
int add (int x, int y, int mod) {
return (0ll + x + y) % mod;
}
int mul (int x, int y, int mod) {
return (1ll * x * y) % mod;
}
int qpow (int x, int y, int mod) {
if (x == 0) return 0;
int ret = 1;
while (y) {
if (y & 1) {
ret = mul (ret, x, mod);
}
y >>= 1;
x = mul (x, x, mod);
}
return ret % mod;
}
int main () {
cin >> a >> b >> p;
cout << qpow (a, b, p) << endl;
}
对于快速幂的理解:
第一类理解:
· y为奇数 -> 【(ans = x ^ {y})】 -> 【(ans = (ans * x) * (x ^ {y - 1}))】,从奇数次幂里面剥离一个1,并把一个x乘到ans里面。
· y为偶数 -> 【(x = x * x,y = y / 2)】,原理是y为偶数时【(x^{y}=(x^{y / 2})^{2})】
第二类理解:
· b可以表示为二进制数:(b=∑{c_i * 2^{i}}),(c_i)代表b每一位0/1
· (a^{b} = a ^ {∑{c_i * 2^{i}}} = prod{a^{c_i * 2^{i}}}),把b的每一位都乘进答案里即可。
两者具有相同的代码,但思想截然不同。