快速幂
顾名思义,快速幂就是快速算底数的n次幂。其时间复杂度为 O(log₂N), 与朴素的O(N)相比效率有了极大的提高。
原理
以下以求a的b次方来介绍
把b转换成二进制数。
该二进制数第i位的权为
![](https://gss1.bdstatic.com/9vo3dSag_xI4khGkpoWK1HF6hhy/baike/s%3D26/sign=6044c668f703738dda4a0b24b21ba471/faf2b2119313b07e13c5e9c00dd7912396dd8cfa.jpg)
例如
![](https://gss3.bdstatic.com/7Po3dSag_xI4khGkpoWK1HF6hhy/baike/s%3D103/sign=885b42e39c16fdfadc6cc2ee878d8cea/d0c8a786c9177f3e48bd45c571cf3bc79e3d5668.jpg)
11的二进制是1011
11 = 2³×1 + 2²×0 + 2¹×1 + 2º×1
因此,我们将a¹¹转化为算
![](https://gss3.bdstatic.com/-Po3dSag_xI4khGkpoWK1HF6hhy/baike/s%3D95/sign=257afe75a8773912c0268964f919a226/e850352ac65c1038803a760ab3119313b17e89b6.jpg)
![](https://gss3.bdstatic.com/-Po3dSag_xI4khGkpoWK1HF6hhy/baike/s%3D95/sign=257afe75a8773912c0268964f919a226/e850352ac65c1038803a760ab3119313b17e89b6.jpg)
代码如下:
- long long modexp(long long a, long long b, int mod)
- {
- long long res=1;
- while(b>0)
- {
- //a=a%mod;(有时候n的值太大了会超出long long的储存,所以要先取余)
- if(b&1)//&位运算:判断二进制最后一位是0还是1,&的运算规则为前后都是1的时候才是1;
- res=res*a%mod;
- b=b>>1;//相当于除以2;
- a=a*a%mod;
- }
- return res;
- }