题目背景
矩阵快速幂
题目描述
给定n*n的矩阵A,求A^k
输入输出格式
输入格式:
第一行,n,k
第2至n+1行,每行n个数,第i+1行第j个数表示矩阵第i行第j列的元素
输出格式:
输出A^k
共n行,每行n个数,第i行第j个数表示矩阵第i行第j列的元素,每个元素模10^9+7
输入输出样例
输入样例#1: 复制
2 1
1 1
1 1
输出样例#1: 复制
1 1
1 1
说明
n<=100, k<=10^12, |矩阵元素|<=1000 算法:矩阵快速幂
#include<bits/stdc++.h>
#define debug(x) cout << "[" << #x <<": " << (x) <<"]"<< endl
#define pii pair<int,int>
#define clr(a,b) memset((a),b,sizeof(a))
#define rep(i,a,b) for(int i = a;i < b;i ++)
#define pb push_back
#define MP make_pair
#define LL long long
#define INT(t) int t; scanf("%d",&t)
#define LLI(t) LL t; scanf("%I64d",&t)
using namespace std;
const int maxn = 105;
const int mod = 1e9 + 7;
struct mat{
LL m[maxn][maxn];
};
LL n,k;
mat cal(mat A,mat B){
mat C;
for(int i = 1;i <= n;i ++)
for(int j = 1;j <= n;j ++){
C.m[i][j] = 0;
for(int x = 1;x <= n;x ++)
C.m[i][j] = (C.m[i][j] + (A.m[i][x] * B.m[x][j]) % mod) % mod;
}
return C;
}
mat quick_mat(mat A,LL coun){
mat C;
for(int i = 1;i <= n;i ++)
for(int j = 1;j <= n;j ++)
C.m[i][j] = (i == j);
while(coun > 0){
if(coun & 1) C = cal(C,A);
A = cal(A,A);
coun >>= 1;
}
return C;
}
int main()
{
while(~scanf("%lld%lld",&n,&k)){
mat tmp;
for(int i = 1;i <= n;i ++)
for(int j = 1;j <= n;j ++)
scanf("%lld",&tmp.m[i][j]);
mat ans = quick_mat(tmp,k);
for(int i = 1;i <= n;i ++,printf("\n"))
for(int j = 1;j <= n;j ++)
printf("%lld ",ans.m[i][j]);
}
return 0;
}