//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的每一位都乘进答案里即可。
两者具有相同的代码,但思想截然不同。