引文
快速幂为什么快速呢,应为它将幂次方 O ( N ) 的 复 杂 度 降 到 了 O ( l o g 2 N ) O(N)的复杂度降到了O(log_2^N) O(N)的复杂度降到了O(log2N),主要思想是将指数转换成二进制表示,然后分解乘法,例如 5 100 5^{100} 5100是100个5相乘,但任何一个整数都可以用二进制的形式表示,例如 100 = ( 1100100 ) 2 100 = (1100100)_2 100=(1100100)2, 所以 5 100 = 5 64 ∗ 5 32 ∗ 5 4 5^{100} = 5^{64} * 5^{32} * 5^4 5100=564∗532∗54,100次乘法转成了3次乘法运算
代码模板
typedef long long ll;
const ll MOD = 1e9 + 7;
ll qpow(ll a, ll b)
{
ll res = 1, p = a;
while(b)
{
if(b & 1) res = res * p % MOD;
p = p * p % MOD;
b >>= 1;
}
return res;
}