关联题目
建议先去看看这个
解法
如果使用
O
(
b
)
O(b)
O(b)计算
a
b
a^b
ab,直接T飞
๑乛◡乛๑小瞄一眼,至少
O
(
l
o
g
b
)
O(logb)
O(logb)级
直接想到二进制,分解一下…
举个例子
11
=
(
1011
)
2
=
2
3
+
2
1
+
2
0
11=(1011)_2=2^3+2^1+2^0
11=(1011)2=23+21+20
所以
3
11
=
3
2
3
+
2
1
+
2
0
=
3
2
3
×
3
2
1
×
3
2
0
3^{11}=3^{2^3+2^1+2^0}=3^{2^3}\times3^{2^1}\times3^{2^0}
311=323+21+20=323×321×320
最好想的就是递归解法
int ksm (int a, int b, int mod) {
if (b & 1)
return a * ksm (a, b - 1) % mod;
else
return ksm (a * a % mod, b / 2) % mod;
}
改成递推的
int ksm (int a, int b, int mod) {
int ans = 1;
for(; b; b >>= 1) {
if (b & 1)
ans = ans * a % mod;
a = a * a % mod;
}
return ans;
}