快速幂
计算an,在朴素算法下,需要O(n)的时间复杂度
a1∗a1=a2a2∗a2=a4a4∗a4=a8a8∗a8=a16a16∗a16=a32a32∗a32=a64
如上,根据倍增原理将a2k转化为了k次计算,时间复杂度为O(logn)
对于普通形式下的幂运算,如a105,则可以写成a1+8+32+64,即105的二进制编码1101001
long long binEXP(int a, int n)
{
long long r = 1;
while (n)
{
if (n & 1)
r = r * a;
a *= a;
n >>= 1;
}
return r;
}
应用1: 幂取模
def MODEXPFAST(a, n, m):
a = a % m
r = 1
while n:
if n & 1:
r = (r * a) % m
a = (a ** 2) % m
n >>= 1
print(r)