快速幂 模板
作者:互联网
快速幂顾名思义,就是快速算某个数的多少次幂。其时间复杂度为O(log₂N),与朴素的O(N)相比效率有了极大的提高。
其核心思想就是
如果k是偶数 那么 x ^ k = ( x ^ 2 ) ^ ( k / 2 )
如果k是奇数 那么 x ^ k = x * ( x ^ ( k - 1 ) )
递归实现即可
#define LL long long
LL quickpow(LL x,LL k,LL mod)
{
if(k==0) return 1;
if(k&1) return x*quickpow(x,k-1,mod)%mod;
else return quickpow(x*x%mod,k>>1,mod)%mod;
}
写成非递归形式
LL quickpow(LL x,LL k,LL mod)
{
LL res=1;
while(k) {
if(k&1) res=res*x%mod;
x=x*x%mod; k>>=1;
}
return res%mod;
}
另一种想法就是
如果k是偶数 x ^ k = ( x ^ ( k / 2 ) ) ^ 2
如果k是奇数 x ^ k = x * ( x ^ ( k / 2 ) ) ^ 2
LL quickpow(LL x,LL k,LL mod)
{
if(k==0) return 1;
LL t=q_pow(x,k>>1,mod)%mod;
if(k&1) return ((t*t%mod)*x)%mod;
return t*t%mod;
}
另外,如果想写(k&1)== 0 的话,
注意& 按位与的优先级比 等号 低 ,要加括号
标签:return,res,LL,quickpow,kkk,快速,模板,mod 来源: https://blog.csdn.net/qq_45646484/article/details/104094801