快速幂及快速幂取模
快速幂顾名思义,就是快速算某个数的多少次幂。其时间复杂度为 O(log₂N), 与朴素的O(N)相比效率有了极大的提高。——bybaidu
快速幂可以用位运算这个强大的工具实现。
代码:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 int pow(int a,int b) 2 { 3 int ans=1; 4 while(b!=0) 5 { 6 if(b&1) 7 ans*=a; 8 a*=a; 9 b>>=1; 10 } 11 return ans; 12 }
快速幂取模需要记住一个定理:积的取模等于取模积的取模;算法是蒙哥马利算法(Orz……)
代码:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 int pow%(int a,int b,int c) 2 { 3 int ans=1; 4 while(b!=0) 5 { 6 if(b&1) 7 ans=(ans*a)%c; 8 a=(a*a)%c; 9 b>>=1; 10 } 11 return ans; 12 }
我今天突然发现x>>1其实就是原数 div 2,同理x>>n即为x div 2^n;
x<<n 则为x*2^n;
算是意外的收获吧,yes!