快速幂
我们知道 \(x\) 个 \(a\) 相乘乘上 \(y\) 个 \(a\) 相乘,等于 \(x+y\) 个 \(a\) 相乘,因此我们可以得出公式 \(a^x\times a^y=a^{x+y}\)。因此,设 \(f(a,b)\) 表示 \(a\) 的 \(b\) 次方,我们可以这样算:
\[f(a,b)=\left\{
\begin{array}{ll}
1~(b=0) \\
a~(b=1) \\
f(a,b-1)\times a~(b\bmod 2=1) \\
f(a,\dfrac{b}{2})^2~(b\bmod 2=0)
\end{array}
\right.
\]
代码模板:
template <typename Ty>
Ty pow(Ty a, Ty b) {
if (!b) {
return 1;
}
if (b == 1) {
return a;
}
int t = pow(a, b / 2);
return t * t * (b & 1 ? a : 1);
}
但是,我们还可以使用二进制的方式进行运算。如:\(a^{(1101_{(2)})}\times a^{(1101_{(2)})}=a^{(11010_{(2)})}\),其实跟前面差不多,但是省去了递归步骤。
template <typename Ty>
Ty pow(Ty a, Ty b) {
int ans = 1;
for (; b; b >>= 1) {
b & 1 && (ans *= a);
a *= a;
}
return ans;
}

浙公网安备 33010602011771号