快速幂是个好东西 ,有时候一些题目需要求高次幂(例如:2^100)的运算或者大量的递归运算(斐波那契数列)
就基本和下面两个死敌说拜拜了
Time limit exceeded←死敌
Memory Limit Exceeded←死敌(还有WA)
切入正题
——-——-——-——-——-——-——-——-——-——-——-——-——-——-——-——-——
首先我们先看看快速幂的优势在哪?
例:2^254
常规运算需要将2连乘254次(2 * 2 …* 2 * 2)
而254二进制表示为11111110(254=0 * 2^0 + 1 * 2^1 + 1*2^2 …+ 1 * 2^8 )
所以2^254=2^(0 * 2^0 + 1 * 2^1 + 1*2^2 …+ 1 * 2^8)=2^(2^1) * 2^(2^2)… * 2^(2^8)
此时运算只用进行7次
但是如何将十进制的幂次转换为二进制呢?
那我们就需要运用到位运算中的:
1.& 按位与运算符
2.>>右移运算符
1.按位与运算符
我们就简单的运用一下来判断末位是否为1,例如11111111&1=1,11111110&1=0
而原因就是使位数为0的项给剔除掉 如例子中的2^254 是为了减少了首项0*2^0这一项的运算
2.右移运算符
刚刚通过按位与运算符判断了末位是否为1,但事实上我们要将所有数都进行判断,那么就要运用到右移运算符。例如11111110>>1则为01111111,11111110>>2则为00111111,高位补0,低位去除。所以我们就用到>>1来达到移位进行判断。
代码如下
a为基数,b为次幂数
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
正因为vis*vis,使得次幂会以2 4 8 16……(2^1 2^2 2^3 2^4……)上升对应着二进制数所对应的十进制数从而达到快速运算的成效。快速幂的基本思想就是这样啦
注: 片段代码或者语言如有错误望谅解并请指出。