题目背景
矩阵快速幂
题目描述
给定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<iostream>
#include<cstring>
#define f(i,l,r) for(i=(l);i<=(r);i++)
using namespace std;
const int MAXN=105,MOD=1000000007;
int n;
struct Matrix{
int a[MAXN][MAXN];
Matrix(){
memset(a,0,sizeof(a));
}
Matrix operator * (const Matrix& x)const{
Matrix ans;
int i,j,k;
f(i,1,n){
f(j,1,n){
f(k,1,n){
ans.a[i][j]=(ans.a[i][j]+(1LL*a[i][k]*x.a[k][j])%MOD)%MOD;
}
}
}
return ans;
}
void read(){
int i,j;
f(i,1,n) f(j,1,n) cin>>a[i][j];
}
void write(){
int i,j;
f(i,1,n){
f(j,1,n){
cout<<a[i][j]<<' ';
}
cout<<endl;
}
}
}A;
inline Matrix Pow(Matrix x,long long k)
{
Matrix ans=x;
k--;
for(;k;k>>=1,x=x*x){
if(k&1) ans=ans*x;
}
return ans;
}
int main()
{
ios::sync_with_stdio(false);
int i,j;
long long k;
cin>>n>>k;
A.read();
A=Pow(A,k);
A.write();
return 0;
}