其实矩阵快速幂和普通快速幂没有什么区别,就是把单个数据改成矩阵,我们只需要能够写出矩阵乘法即可,然后按照快速幂的老套路就行了;
#include<iostream> #include<algorithm> using namespace std; #define MAXN 120 const int mod=1e9+7; typedef long long ll; int n; struct mat { ll m[MAXN][MAXN];//矩阵结构体 }unit;//unit为单位矩阵,即主对角线全部为1,这样任何矩阵与单位矩阵相乘都为它本身 mat msub(mat a,mat b)//矩阵相乘函数 { mat ret; ll x; for(int i=0;i<n;i++) { for(int j=0;j<n;j++) { x=0; for(int k=0;k<n;k++) { x+=((a.m[i][k]*b.m[k][j])%mod);//取余 } ret.m[i][j]=x%mod;//取余 } } return ret; } void init_unit()//初始化单位矩阵 { for(int i=0;i<MAXN;i++) { unit.m[i][i]=1; } } mat qpow(mat a,ll x)//快速幂 { mat ans=unit; while(x) { if(x&1) ans=msub(ans,a); a=msub(a,a); x>>=1; } return ans; } int main() { ll x; init_unit(); cin>>n>>x; mat a,ans; for(int i=0;i<n;i++) { for(int j=0;j<n;j++) { cin>>a.m[i][j]; } } ans=qpow(a,x); for(int i=0;i<n;i++) { for(int j=0;j<n;j++) { if(j!=n-1) cout<<ans.m[i][j]<<" "; else cout<<ans.m[i][j]<<endl; } } return 0; }