【快速幂】O(logn)时间复杂度
int qpow(int base, int n)
{
int ans = 1;
while(n)
{
if(n&1) ans*=base;
base = base * base;
n/=2;
}
return ans;
}
【矩阵快速幂】
该算法只适用于方阵
设 A 为方阵 , 快速求 A n 的算法
【应用】求递推式的第n项,例如
斐波那契 递推公式 f(n) = f(n-1) + f(n-2)
可以转换成以下矩阵运算:
由上述递推式我们可以求出矩阵
因此原本求 f(1000) 需要递推1000次,时间复杂度为O(n)
用矩阵快速幂,求f(1000, 999) = f(2, 1) * A1000 设方阵阶数为m,矩阵相乘相乘时间复杂度为 O(m3),矩阵快速幂为O(logn)
则计算8*log21000 < 1000
模板
const int N=9;
struct Matrix{///矩阵结构体
ll matrix[N][N];
};
const int mod = 1e9 + 7;
void init(Matrix &res)///初始化为单位矩阵
{
memset(res.matrix,0,sizeof(res.matrix));
for(int i=0;i<N;i++)
res.matrix[i][i]=1;
}
Matrix multiplicative(Matrix a,Matrix b)///矩阵乘法
{
Matrix res;
memset(res.matrix,0,sizeof(res.matrix));
for(int i = 0 ; i < N ; i++){
for(int j = 0 ; j < N ; j++){
for(int k = 0 ; k < N ; k++){
res.matrix[i][j] += a.matrix[i][k]*b.matrix[k][j];
res.matrix[i][j] %= mod;
}
}
}
return res;
}
Matrix Pow(Matrix mx,ll m)///矩阵快速幂
{
Matrix res,base=mx;
init(res);
while(m)
{
if(m&1)
res=multiplicative(res,base);
base=multiplicative(base,base);
m>>=1;
}
return res;
}