矩阵快速幂
大体想法为模仿整数快速幂;
整数快速幂代码:
ll quick(int a,int b){
int ans=1;
while(b){
if(b&1) ans*=a;//位运算思想
a*=a;//累加权值
b>>=1;//b右移一位
}
return ans;
}
- 可使用结构体保存输入矩阵,代码清晰
- 整数快速幂中的ans=1可由单位矩阵(对角线为1)替换
- 配合矩阵乘法使用
上代码
#include<iostream>
using namespace std;
typedef long long ll;
const int maxn=35;
int a,b;
struct mat{
ll m[maxn][maxn];
};
mat in,im;
mat mul(mat x,mat y){//矩阵乘法
mat c;
for(int i=0;i<a;i++)
for(int j=0;j<a;j++)
c.m[i][j]=0;//必须初始化0,否则可能使答案错误
for(int i=0;i<a;i++){
for(int j=0;j<a;j++){
for(int k=0;k<a;k++){
c.m[i][j]+=x.m[i][k]*y.m[k][j];
}
}
}
return c;
}
mat pow(mat a,int b){//类似于整数快速幂
mat ans=im;//单位矩阵相当于1
while(b){
if(b&1) ans=mul(ans,a);
a=mul(a,a);
b>>=1;
}
return ans;
}
int main(){
cin>>a>>b;
for(int i=0;i<a;i++){
for(int j=0;j<b;j++){
cin>>in.m[i][j];
}
}
for(int i=0;i<a;i++){
im.m[i][i]=1;
}
mat ans=pow(in,b);
for(int i=0;i<a;i++){
for(int j=0;j<b;j++){
cout<<ans.m[i][j]<<" ";
}
cout<<endl;
}
return 0;
}