快速幂模板及对其的理解

这篇博客详细介绍了快速幂算法的实现原理,通过一个实例展示了如何将指数拆分为2的幂次形式,并利用位运算高效地计算大数的幂。在代码解释中,解释了每个步骤如何更新答案和基数,以及为何进行位移操作。文章最后提供了一道相关题目供读者练习,加深理解。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

下面先贴上学长教的快速幂模板:

typedef long long ll;
ll qpow(ll a,ll b,ll mod)
{
	ll ans=1;
	a%=mod;
	while(b>0)
	{
		if(b & 1)
		{
			ans=(ans*a)%mod;
		}
		a=(a*a)%mod;
		b>>=1;
	}
	return ans;
}

那么这个快速幂是如何实现的呢?

原理就是将a^b拆分掉,拆分成若干部分,每一部分a的指数都是2的n次方的格式,下面是一个例子:
在这里插入图片描述
就像这样指数b被拆分成了三个部分,被拆分的三个部分对应了二进制的13(1101)的三个1,由此我们得知,可以对指数b进行相应的位运算判断和实时更新a来计算a的b次方,下面是对于代码的解释:

在qpow函数中定义了ans并赋给其初值1,用它来表示最终答案,然后进入while循环,首先进行按位与操作,这一步操作的目的是看看二进制的b的最低位是否为1,若为1代表被拆分成的各个部分中有这一部分,那就让ans乘上此时的a,完事之后要更新a的值,以和此时遍历到的b的位匹配上,如何更新?只要让a*a即可,打个比方,遍历到b的最低位时,a就是a的2的0次方,也就是它本身,b的最低为不为0,那就让ans乘上现在的a,更新a,并让b右移1位来舍弃b的最低位(因为已经用完它了);当遍历到b的次低位时,此时a的值是a的2的1次方(在上一步计算完ans后a更新了),但此时b的次低位的值是0,因此这一轮ans不更新,但是a还要更新,因为马上就要遍历到b的倒数第三位了,a的值要与之匹配,然后b再右移一位舍弃掉次高位,往后一直重复这样的操作,直到b变为0,也就是不能再分了为止,最后跳出循环并将最终结果ans返回。

可以拿这一个题练练手:链接

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值