n*n的矩阵的k次幂可以通过快速幂运算在O(n^3logk)时间内求出
1.Matrix结构体
typedef long long ll;
struct Matrix
{
int row,col;
ll mat[N][N];
void init(int row,int col,bool ok=false){
this->row=row;
this->col=col;
memset(mat,0,sizeof(mat));
if(!ok) return;
for(int i=0;i<N;i++){
mat[i][i]=1;
}
}
Matrix operator *(const Matrix& B){
Matrix C;
C.init(row,B.col);
for(int k=0;k<col;k++){
for(int i=0;i<row;i++){
if(mat[i][k]==0) continue;
for(int j=0;j<B.col;j++){
if(B.mat[k][j]==0) continue;
C.mat[i][j]+=(mat[i][k]%Mod)*(B.mat[k][j]%Mod);
C.mat[i][j]=C.mat[i][j]%Mod;
}
}
}
return C;
}
Matrix pow(ll n){
Matrix B,A=*this;
B.init(row,col,1);
while(n){
if(n&1) B=B*A;
A=A*A;
n>>=1;
}
return B;
}
};
2.vector二维数组
typedef vector<int> vec;
typedef vector<vec> mat;
typedef long long ll;
const int M=10000;
//计算A*B
mat mul(mat& A,mat& B)
{
mat C(A.size(),vec(B[0].size()));
for(int i=0;i<A.size();i++){
for(int k=0;k<C.size();k++){
for(int j=0;j<B.size();j++){
C[i][j]=(C[i][j]+A[i][k]*B[k][j])%M;
}
}
}
return C;
}
//计算A^n
mat pow(mat A,ll n)
{
mat B(A.size(),vec(A.size()));
for(int i=0;i<A.size();i++){
B[i][i]=1;
}
while(n>0){
if(n&1) B=mul(B,A);
A=mul(A,A);
n>>=1;
}
return B;
}

本文介绍了一种使用快速幂运算高效计算n*n矩阵的k次幂的方法,并提供了两种实现方案:一是通过定义Matrix结构体实现矩阵乘法及快速幂运算;二是利用vector二维数组实现矩阵的乘法与快速幂运算。
1272

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



