传送门:洛谷-矩阵快速幂
给定n*n的矩阵A,求A^k。
n<=100, k<=10^12, |矩阵元素|<=1000
代码:
#include<bits/stdc++.h>
#define f(x,a,b) for(int x=a;x<=b;x++)
using namespace std;
typedef long long ll;
const ll MOD=1e9+7;
int n;ll k;
struct Mat{
ll Ar[101][101];
void itl(){
f(i,1,n){
f(j,1,n){
if(i==j)
Ar[i][j]=1;
else
Ar[i][j]=0;
}
}
}
void clr(){
f(i,1,n){
f(j,1,n){
Ar[i][j]=0;
}
}
}
}op;
Mat operator * (const Mat A,const Mat B)
{
Mat u;u.clr();
f(i,1,n){
f(j,1,n){
f(k,1,n){
u.Ar[i][j]=(u.Ar[i][j]+A.Ar[i][k]*B.Ar[k][j] % MOD) % MOD;
}
}
}
return u;
}
inline Mat MatrixPow(Mat a,ll b)
{
Mat ret;ret.itl();
while(b){
if(b&1){
ret=ret*a;
}
a=a*a;
b>>=1;
}
return ret;
}
int main(){
scanf("%d%lld",&n,&k);//ll
f(i,1,n){
f(j,1,n){
scanf("%lld",&op.Ar[i][j]);
}
}
op=MatrixPow(op,k);
f(i,1,n){
f(j,1,n){
printf("%lld ",op.Ar[i][j]);
}
printf("\n");
}
return 0;
}