矩阵快速幂是一个很神奇的东西,你能够运用它来完成一些普通递推式无法完成的任务,当然了解矩阵快速幂之前,我们要先知道什么是矩阵乘法:
矩阵乘法:
基本规则:当且仅当两个矩阵的元素个数为n*m和m*k(即前一个矩阵的列与后一个矩阵的行要相等)
工作方法:矩阵乘法实现代码如下:
#include<bits/stdc++.h>
const int Mod=1000000000+7;
int n,m,l,p;
struct juxing{//定义一个矩形
int a[1001][1001];
int* operator [](int x){//返回指针(重载括号)
return a[x];
}
}S,T,A;//把S矩阵和T矩阵相乘,答案存储在A矩阵里
int main(){
int i,j,k;
scanf("%d%d%d%d",&m,&n,&p,&l);
if(n!=p){//为了保证可以矩乘
printf("error!\n");return 0;
}
for(i=1;i<=m;i++)
for(j=1;j<=n;j++)
scanf("%d",&S[i][j]);
for(i=1;i<=p;i++)
for(j=1;j<=l;j++)
scanf("%d",&T[i][j]);
for(i=1;i<=m;i++)
for(j=1;j<=l;j++){
A[i][j]=0;
for(k=1;k<=n;k++)
A[i][j]=(A[i][j]+S[i][k]*T[k][j])%Mod;//防止答案超出int
}
for(i=1;i<=m;i++)
for(j=1;j<=l;j++)
printf("%d%c",A[i][j],j==l?'\n':' ');
return 0;
}
以上就是矩阵乘法,如果还有不懂的,看这里
现在进入到我们的重点:矩阵快速幂,这其实就是普通快速幂的进化,只是建立在矩阵乘法的基础上,这里推荐一种十分便捷迅速的方法:二进制快速幂。
算法都是建立在问题的基础上,这里我们给大家一个问题:要求一个矩阵S的k次方。
代码如下:
#include<bits/stdc++.h>
const int Mod=1000000000+7;
int n,m,l,p;
struct juxing{//定义一个矩形
int a[1001][1001];
int* operator [](int x){//返回指针(重载括号)
return a[x];
}
}S,T,A;//把S矩阵和T矩阵相乘,答案存储在A矩阵里
void chengfa(){
int i,j,k;
for(i=1;i<=m;i++)
for(j=1;j<=l;j++){
for(k=1;k<=n;k++)
A[i][j]=(A[i][j]+A[i][k]*S[k][j])%Mod;//防止答案超出int
}
}
void chengfa2(){
int i,j,k;
for(i=1;i<=m;i++)
for(j=1;j<=l;j++){
for(k=1;k<=n;k++)
S[i][j]=(S[i][j]+S[i][k]*S[k][j])%Mod;//防止答案超出int
}
}
int main(){
int i,j,k;
scanf("%d%d",&m,&n);
for(i=1;i<=m;i++)
for(j=1;j<=n;j++)
scanf("%d",&S[i][j]);
scanf("%d",&k);
for(i=1;i<=m;i++)
for(j=1;j<=n;j++)
A[i][j]=1;
while(k){
if(k&1)chengfa();
chengfa2();
k>>=1;
}
for(i=1;i<=m;i++)
for(j=1;j<=n;j++)
printf("%d%c",A[i][j],j==n?'\n':' ');
return 0;
}