题意:给定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;
}