有关快速幂的问题

法一:运用位运算简化计算

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=242221。因此, 3 22 = 3 2 4 ∗ 3 2 2 ∗ 3 2 1 3^{22} = 3^{2^4} * 3^{2^2} * 3^{2^1} 322=324322321。我们有以下几点发现:

  • 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/2x,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;
}

  • 23
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值