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