大家好,我是小黄呀。
题目
斐波那契数列(Fibonacci):第1,2两个数为1,1。从第三个数开始,该数是其前面两个数之和。
快速幂解法
int ans=1;
a=a%c;
while(b>0)
{
if(b%2==1) ans=(ans*a)%c;
b=b/2;
a=(a*a)%c;
}
ab mod c=(a mod c)b mod c(ab) mod c=[(a mod c)×(b mod c)mod c ]ab mod c=a2(b/2) mod c- 当b是奇数时,那么有
a^b = a * a^(b-1) - 当b是偶数时,那么有
a^b = a^(b/2) * a^(b/2) - 算法解释:
- 根据公式1,先对
a取模;对a进行循环幂运算,每次将b除以2; - 当
b为偶数时,直接出2;当b为奇数时,因为整形int原因,b除以2为小数会将小数位舍去,此时指数降为b-1,因此将ans乘以a,即将b-1+1变为b,再继续循环。
- 根据公式1,先对
快速幂迭代模板
模板代码:快速幂(log b)
int PowerMod(int a,int b,int c)
{
int ans=1;
a=a%c;
while(b>0)
{
if(b%2==1) ans=(ans*a)%c;
b=b/2;
a=(a*a)%c;
}
return ans;
}
//将b%2==1 和 b=b/2 改为位运算如下
typedef long long ll
ll binaryPow(ll a, ll b, ll m){
ll ans = 1;
while(b > 0){
if(b & 1){
ans = ans * a % m;
}
a = a * a % m;
b >>= 1;
}
return ans;
}
快速幂递归模板
typedef long long ll;
ll binaryPow(ll a, ll b, ll m){
if(b == 0)
return 1;
else if(b % 2 == 1)
return a * binaryPow(a, b - 1, m) % m;
else{
ll num = binaryPow(a, b/2, m) % m; //优化
return num * num % m;// 不直接写成return binaryPow(a, b/2, m) * binaryPow(a, b/2, m)
}
}
矩阵乘法与矩阵快速幂
- 矩阵乘法模板
- 矩阵快速幂代码
Matrix fast_pow(Matrix a, int x) {
Matrix ans;
ans.x = a.x;
for(int i = 0; i < ans.x; i++)
ans.a[i][i] = 1;
while(x) {
if(x&1)
ans = ans*a;
a = a*a;
x >>= 1;
}
return ans;
}
本文详细介绍了使用快速幂算法解决斐波那契数列问题的方法,包括快速幂的迭代和递归模板,以及如何利用矩阵乘法和矩阵快速幂优化计算过程。快速幂算法能够有效减少计算次数,提高效率。


及矩阵快速幂的延伸&spm=1001.2101.3001.5002&articleId=107164800&d=1&t=3&u=d3007bb4397546a8acca5df0994de1e4)
3009

被折叠的 条评论
为什么被折叠?



