算法-快速幂

前言

本蒟蒻最近刚好刷完搜索部分,该刷分治算法了。第一题就是快速幂的模板题,今天我就顺着这道题讲讲刚学来的快速幂算法吧。(写得不好勿喷)

原理

如果你要用电脑计算\(a^b\),怎样快速求出解呢?
最容易想到的就是暴力运算\(b\)次,思路是简单,可惜速度不快。而相比较下,快速幂的速度就很快了。(看名字)
比如你想计算\(3^{13}\)\(13\)在二进制下\((1101)_2\),所以\(13\)就可以表示为\(2^0+2^2+2^3\),根据\(a^{x+y}=a^x\times{a^y}\)可以推导出:
\(3^{13}=3^{2^0+2^2+2^3}=3^{2^0}\times{3^{2^2}}\times{3^{2^3}}\)
也就是\(a^b\)变为多个\(a^{2^n}\)相乘的形式(\(n\)为二进制下\(1\)所在的位)

实现

讲完了原理,实现也就不难了。
首先我们要检查二进制每一位是否为\(1\),将\(a\)自乘来表示\(a^{2^n}\),即每检查一位就自乘一次,如果该位为\(1\)就乘到答案(\(ans\))上
介绍一下c++下的位运算:

/*
>> 右移运算
比如1101001‬右移一位得到110100
& 与
这里运用&1,若最后一位为1就返回1,最后一位为0就返回0,起到检查位的作用
*/

所以我们不断用>>右移,并用&

猜你喜欢

转载自www.cnblogs.com/mjxdev/p/12318478.html