法一:运用位运算简化计算
以
3
22
3^{22}
322 为例,它的底数为
3
3
3,指数为
22
22
22。指数的二进制形式为 10110
。通过二进制与十进制的转换,我们可以把
22
22
22 分解为
22
=
2
4
∗
2
2
∗
2
1
22 = 2^4 * 2^2 * 2^1
22=24∗22∗21。因此,
3
22
=
3
2
4
∗
3
2
2
∗
3
2
1
3^{22} = 3^{2^4} * 3^{2^2} * 3^{2^1}
322=324∗322∗321。我们有以下几点发现:
- 1、 2 4 2^4 24, 2 2 2^2 22 和 2 1 2^1 21 与二进制形式中 1 1 1 的出现位置有关,那么,这也导致 3 2 4 3^{2^4} 324, 3 2 2 3^{2^2} 322 和 3 2 1 3^{2^1} 321 有这样的关系。
- 2、我们知道,在二进制中,相邻的两位,从“右边到左边”要
× 2
。比如, 2 2 = 2 1 × 2 2^2 = 2^1 \times 2 22=21×2; 由于中间隔了一个 0 0 0,所以要乘两个2
, 2 3 = 2 2 × 2 ⇒ 2 4 = 2 3 × 2 2^3 = 2^2 \times 2~\Rightarrow~2^4 = 2^3 \times 2 23=22×2 ⇒ 24=23×2。反应到 3 22 3^{22} 322 上,就变成了平方
关系。比如, 3 2 2 = 3 2 1 × 3 2 1 3^{2^2} = 3^{2^1} \times 3^{2^1} 322=321×321; 由于中间隔了一个 0 0 0,所以要平方
两次, 3 2 3 = 3 2 2 × 3 2 2 ⇒ 3 2 4 = 3 2 3 × 3 2 3 3^{2^3} = 3^{2^2} \times 3^{2^2}~\Rightarrow~3^{2^4} = 3^{2^3} \times 3^{2^3} 323=322×322 ⇒ 324=323×323。
ll quick_pow(ll x, ll n, ll mod)
{
ll ans = 1;
while (n > 0)
{
if (n & 1)
ans = ans * x % mod;
x = x * x % mod;
n >>= 1;
}
return ans;
}
法二:运用递归的思想
对于 x n x^n xn,有
x n = { ( x 2 ) ⌊ n / 2 ⌋ , n 为偶数 ( x 2 ) ⌊ n / 2 ⌋ ∗ x , n 为奇数 \begin{split} x^n = \begin{cases} {(x^2)}^{\lfloor n / 2\rfloor}&,n为偶数 \\ {(x^2)}^{\lfloor n / 2\rfloor} \ast x&,~n为奇数 \end{cases} \end{split} xn={(x2)⌊n/2⌋(x2)⌊n/2⌋∗x,n为偶数, n为奇数
令
x
n
=
x^n =
xn= quick_pow(x, n)
,则递归方程:
quick_pow(x, n) = { 1 , n = = 0 quick_pow(x, n / 2) , n 为非 0 偶数 quick_pow(x, n / 2) ∗ x , n 为奇数 \begin{split} \text{quick\_pow(x, n)} = \begin{cases} 1&,n==0 \\ \text{quick\_pow(x, n / 2)}&,n为非0偶数 \\ \text{quick\_pow(x, n / 2)} \ast \text{x}&,n为奇数 \end{cases} \end{split} quick_pow(x, n)=⎩ ⎨ ⎧1quick_pow(x, n / 2)quick_pow(x, n / 2)∗x,n==0,n为非0偶数,n为奇数
ll quick_pow(ll x, ll n, ll mod)
{
if (n == 0) return 1;
ll ans = quick_pow1(x * x % mod, n / 2, mod);
if (n & 1) ans = ans * x % mod;
return ans;
}
完