快速幂顾名思义,就是快速算某个数的多少次幂。其时间复杂度为O(log₂N),与朴素的O(N)相比效率有了极大的提高。
其核心思想就是
如果
是偶数 那么 x ^ k = ( x ^ 2 ) ^ ( k / 2 )
如果
是奇数 那么 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;
}
另一种想法就是
如果
是偶数 x ^ k = ( x ^ ( k / 2 ) ) ^ 2
如果
是奇数 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;
}
另外,如果想写(
&
)
0 的话,
注意& 按位与的优先级比 等号 低 ,要加括号