- 快速幂
- 矩阵快速幂
1、快速幂
描述:
快速计算底数base的exp次幂,其时间复杂度为 O(log₂N)。
// 快速幂取模
ll quickMod(ll base,ll exp,ll mod){
ll ans=1;
while(exp){
if(exp&1)ans=ans*base%mod;
exp>>=1;
base=base*base%mod;
}
return ans;
}
2、矩阵快速幂
描述:
n*n矩阵的exp次幂。
// 矩阵快速幂取模
ll n; //n*n矩阵
struct Mat{
ll m[Max_n][Max_n];
Mat(){memset(m,0,sizeof(m));}
Mat operator*(Mat &a){
Mat b;
for(int i=0;i<n;i++){
for(int j=0;j<n;j++)
for(int k=0;k<n;k++)
b.m[i][j]=(b.m[i][j]+m[i][k]*a.m[k][j])%mod;
}
return b;
}
};
Mat quickMod(Mat base,ll exp){
Mat ans;
for(int i=0;i<n;i++)ans.m[i][i]=1; //单位矩阵初始化
while(exp){
if(exp&1)ans=ans*base;
exp>>=1;
base=base*base;
}
return ans;
}
应用:
主要通过把数放到矩阵的不同位置,然后把普通递推式变成”矩阵的等比数列”,最后快速幂求解递推式。
给一些简单的递推式:
1.f(n)=a*f(n-1)+b*f(n-2)+c;(a,b,c是常数)
2.f(n)=c^n-f(n-1) ;(c是常数)
3.f(n)=f(n-1)+(-1)^n*f(n-2);
=>f(n)=f(n-2)+f(n-4);4.f(n)=f(n-1)+f(n-2)+n^3+n^2+n+1;