今天听了一位大佬讲的课,想把学的内容记下来,有搜了搜相关资料,整理一下。
一、快速幂
什么是快速幂?快速幂就是比通常累乘更快的算底数的n次幂。时间复杂度为 O(log₂N), 而累乘的为O(N)。
- 引入:假如我们计算a8,如果我们已经计算到了a4这一步,通常是再乘4次a,但是此时平方一次就可以得到答案了啊。计算a32可以一直平方得到答案,但是计算a36就不能光平方了。
- 原理:想一想,36 = 100100(2), a36 = a4 * a32 。所以,可以先让a一直平方,在平方第二次时,让ans乘以此时的a (ans 开始为 1),然后a继续平方。当a平方第五次时,再让ans乘以a,此时,ans = ans * a32,就得到a36了。发现,ans要乘a的时机取决于幂的次数以二进制表示时,1的位置。
- 算法:每平方一次,让幂次的二进制右移一位。a每次平方(a *= a)前先判断(b & 1 == 1),满足则对ans进行一次乘法,ans *= a。
- 代码:
//循环式
#define ll long long
ll pow_1(ll a, ll b, ll p)//计算a^b%p
{
ll ans = 1;
while(b)
{
if(b & 1) ans = ans * a % p;
a = a *