看了原理之后顿时感受到线性代数的重要,md这不就是线
代才讲过的矩阵乘法吗,orz。。。
这就是大概原理(将两矩阵的对应行列乘积之和作为答案矩阵的一项),显然矩阵乘法还是一个矩阵
矩阵乘法的成立有一个就是A矩阵的列必须和B矩阵的行相等(不过代码一般都是方阵到不用太过担心)
附模板代码:
#include <iostream>//矩阵快速幂(就是把数的乘法变成矩阵乘法)
using namespace std;
#define ll long long
#define lll 1000000007
ll a,b;
typedef struct l{//设立结构体矩阵
ll net[105][105];
}jz;
jz jzkum(jz n,jz m){//矩阵快速幂模板
jz c;
for(ll i=0;i<a;i++){//初始化答案矩阵为0
for(ll j=0;j<a;j++){
c.net[i][j]=0;
}
}
for(ll i=0;i<a;i++){
for(ll j=0;j<a;j++){
for(ll k=0;k<a;k++){
c.net[i][j]+=n.net[i][k]*m.net[k][j]%lll;//矩阵乘法
c.net[i][j]%=lll;
}
}
}
return c;
}
int main(){
jz A,B;
cin>>a>>b;
for(ll i=0;i<a;i++){//输入原始矩阵
for(ll j=0;j<a;j++){
cin>>A.net[i][j];
}
}
for(int i=0;i<a;i++){//将答案矩阵初始化为单位矩阵
B.net[i][i]=1;
}
while(b!=0){//二进制快速幂
if(b&1){
B=jzkum(B,A);
}
A=jzkum(A,A);
b>>=1;
}
for(ll i=0;i<a;i++){//输出
for(ll j=0;j<a;j++){
cout<<B.net[i][j]<<" ";
}
cout<<endl;
}
return 0;
}