快速幂顾名思义就是快速求幂,也常用于求幂的模(余数)
例如求Xq,常规算法是乘q次X,时间复杂度为O(n),而快速幂复杂度为O(log2n),我们看下如何实现
n用二进制可写成2k1+2K2+...2kn
故Xn=X2^k1+2^k2+...+2^kn=X2^k1·X2^k2·...·X2^kn
从二进制n的末尾开始,累乘x,即通项为X2^kn ,若n的该位为1累乘通项,从右往左删掉n的每一位直到n为0
int fun(int x,int n){ int ans=1,base=x; while(n!=0){ if(n&1) //若二进制数最后一位为1返回1 ans*=base; base*=base; n>>=1; //去掉二进制数n最后一位 } return ans; }
时间: 2024-11-03 22:35:53