题意:给定n*n的矩阵A,求A^k
解法:矩阵快速幂;
1.矩阵快速幂;假设有 A和 B两个矩阵,当矩阵A的列数等于矩阵B的行数时,A与B可以相乘得到矩阵 C:
(1) 矩阵 C的行数等于矩阵 A的行数,C的列数等于 B的列数;
(2) 乘积 C的第 行第 列的元素等于矩阵 A的第 行的元素与矩阵 B的第 列对应元素乘积之和。
明白了这些原理之后,就可以利用快速幂的原理对矩阵进行运算了;
附上代码:
#include<cstdio> #include<cstring> #include<iostream> #include<algorithm> #define ll long long #define rg register using namespace std; const int mod = 1e9+7; ll n,k; ll a[101][101],b[101][101]; ll ans[101][101]; inline void matrix(){ memcpy(b,ans,sizeof(ans)); memset(ans,0,sizeof(ans)); for(rg int k=1;k<=n;++k) for(rg int i=1;i<=n;++i) for(rg int j=1;j<=n;++j) { ans[i][j]=(ans[i][j]+(b[i][k]*a[k][j])%mod)%mod; } } inline void matrix_(){ memset(b,0,sizeof(b)); for(rg int k=1;k<=n;++k) for(rg int i=1;i<=n;++i) for(rg int j=1;j<=n;++j){ b[i][j]=(b[i][j]+(a[i][k]*a[k][j])%mod)%mod; } memcpy(a,b,sizeof(b)); } inline void matrix_ksm(ll bas){ while(bas){ if(bas&1) matrix(); matrix_(); bas>>=1; } } int main() { scanf("%lld%lld",&n,&k); for(int i=1;i<=n;++i) for(int j=1;j<=n;++j){ scanf("%d",&a[i][j]); if(i==j) ans[i][j]=1; } matrix_ksm(k); for(int i=1;i<=n;++i){ for(int j=1;j<=n;++j) printf("%lld ",ans[i][j]); cout<<endl; } return 0; }