快速幂运算
在计算幂运算时,无论是我们平时在cmath里面用的pow函数,还是手写的pow函数,使用的都是n个数字连乘的方法。
ll pow(ll x, ll n)
{
ll res = 1;
while(n–)
res *= x;
return res;
}
计算x^n时,使用幂运算时的复杂度为O(n),我们来考虑一种加速幂运算的方法。
1、如果n=2^k,可以将其表示为
x^n=〖〖x^2〗^2〗^2…
只要做k次平方运算就可以轻松求得。由此我们可以想到,先将n表示为2的幂次的和。
n= 2^k1+2^k2+2^k3
就有
〖x^n=x〗^(2^k1 ) x^(2^k2 ) x^(2^k3 )
只要在依次求的同时进行计算就好了。最终得到了 O(logn)计算幂运算的算法。
ll quickpow(ll x, ll n)
{
ll res = 1;
while(n>0)
{
if(n & 1) res = res * x ;
x = x*x ;
n >>= 1;
}
return res;
}
例如:〖x^22=x〗^16 x^4 x^2
22转换成二进制数是11010.