快速幂
简述
快速幂是一般求幂方法的优化,主要是在时间复杂度上的优化,从O(n)到O(logn),极大的降低了时间复杂度,也可以解决一些对时间复杂度要求严格的题目。
一般求幂方法
#include <stdio.h>
#define ll long long int
ll fun(ll a, ll b) { //fun用于求a^b的值
ll ans = 1; //ans用于存放结果
while (b--) {
ans = ans * a;
}
return ans;
}
由上面代码可见,一般求幂方法简单暴力,很容易会时间超限什么的,个人不推荐用,除非在那道题中可以用。
快速求幂方法
#define ll long long int
ll fun(ll a, ll b) { //fun用于求a^b的值,a作为基数,b作为次数
ll ans = 1; //ans用于存放结果
while (b) { //当次数b==0时,while循环结束
if (b & 1) { //判断次数b是否为奇数,b & 1等价于b % 2,而且时间复杂度更低
ans *= a; //当数为奇数时,将基数a乘入结果中
}
b >>= 1; //次数b除以2,比b/=2的时间复杂度更低
a *= a; //基数a翻a倍
}
return ans;
}
快速幂的主要思路就是将需求数拆分成若干个数的乘积。
原理借鉴于https://blog.csdn.net/csdnqixiaoxin/article/details/80958620
快速幂取模方法
#define ll long long int
ll fun(ll a, ll b, ll mod) { //fun用于求a^b的值,a作为基数,b作为次数,mod作为模
ll ans = 1; //ans用于存放结果
while (b) { //当次数b==0时,while循环结束
if (b & 1) { //判断次数b是否为奇数,b & 1等价于b % 2,而且时间复杂度更低
ans *= a % mod; //当数为奇数时,将基数a乘入结果中并取一次模
}
b >>= 1; //次数b除以2,比b/=2的时间复杂度更低
a *= a % mod; //基数a翻a倍并取一次模
}
return ans % mod; //这里的模,可取可不取,保险就取
}
方法一样就不再解释。