快速幂

我们知道 \(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;
}
posted @ 2023-10-15 16:06  haokee  阅读(9)  评论(0)    收藏  举报