0. 介绍
传统算 a b a^b ab需要 b − 1 b-1 b−1次,快速幂将 b b b分解成 2 2 2进制的形式简化为 l o g 2 ( b ) log_2(b) log2(b)次
1. 实现
将 b b b化为2进制位的形式。
b = ∑ i = 0 n c i × 2 i , c i ∈ { 0 , 1 } b=\sum_{i=0}^{n}c_i \times2^i, c_i \in \{0,1\} b=i=0∑nci×2i,ci∈{0,1}
a b = a ∑ i = 0 n c i × 2 i a b = a 2 k 1 ∗ a 2 k 2 . . . . a^{b}=a^{\sum_{i=0}^{n}c_i\times2^i}\\ a^{b}=a^{2^{k1}}* a^{2^{k_2}}.... ab=a∑i=0nci×2iab=a2k1∗a2k2....
又有
a 2 3 = a 2 2 × a 2 2 a^{2^3}=a^{2^2} \times a^{2^2} a23=a22×a22
所以我们可以从底往上进行递推。
- 代码
long long fast_pow(long long a,unsigned long long b,long long MOD) {long long base = a%MOD;long long ans = 1;while (b) {if (b & 1) ans = ans * base % MOD; b >>= 1;if (b)base = base * base % MOD;}return ans % MOD ;}