计算ab mod p。
时间复杂度:O(logb)
注:十进制数b在二进制下的位数为 int(log2b)+1。
算法原理:
十进制数b可表示为 b = ck-12k-1+ … + c121+c020 (ci=0或1,k为b的位数)
所以
a
b
=
(
a
2
k
−
1
)
c
k
−
1
⋯
(
a
2
1
)
c
1
⋅
(
a
2
0
)
c
0
a^b = (a^{2^{k-1}})^{c_{k-1}}\cdots (a^{2^{1}})^{c_{1}}\cdot (a^{2^{0}})^{c_{0}}
ab=(a2k−1)ck−1⋯(a21)c1⋅(a20)c0
且有
a
2
n
+
1
=
(
a
2
n
)
2
a^{2^{n+1}}=(a^{2^n})^2
a2n+1=(a2n)2
# include <bits/stdc++.h>
using namespace std;
int main() {
int a, b, p; scanf("%d %d %d", &a, &b, &p);
// alg
int ans = 1 % p; // 处理 p=1的情况
while (b) {
if (b & 1) ans = (long long)ans*a % p; // ci为 1
a = (long long)a*a % p; // 转换类型防止溢出
b >>= 1; // i +1
}
// output
printf("%d\n", ans);
return 0;
}