P3390 【模板】矩阵快速幂

传送门

下面给出了重载运算符 ∗ * 的方法。
时间复杂度: O ( n 3 l o g k ) O(n^3logk) O(n3logk)

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=1e2+10,mod=1e9+7;
#define mst(a) memset(a,0,sizeof a)
ll n,k;
struct Mat{
	ll a[N][N];
	Mat operator * (const Mat & mat)const{ //重载乘号 
		Mat ans;
		memset(ans.a,0,sizeof ans.a);//初始化 
		for(int i=1;i<=n;i++)
			for(int j=1;j<=n;j++)
				for(int x=1;x<=n;x++)
					ans.a[i][j]=(ans.a[i][j]+a[i][x]*mat.a[x][j]%mod)%mod;
		return ans; 
	}
	void Print(){ //封装一个打印函数. 
		 for(int i=1;i<=n;i++,puts(""))
		 	for(int j=1;j<=n;j++)
		 		printf("%lld ",a[i][j]);
	}
}m;
Mat ksm(Mat m,ll x){ //矩阵快速幂板子 
	 Mat ans;
	 memset(ans.a,0,sizeof ans.a); 
	 for(int i=1;i<=n;i++) ans.a[i][i]=1;//初始化单位矩阵. 
	 while(x){
	 	 if(x&1) ans=ans*m;
	 	 m=m*m;
	 	 x>>=1;
	 }
	 return ans;
}
int main(){
	scanf("%lld%lld",&n,&k);
	for(int i=1;i<=n;i++)
		for(int j=1;j<=n;j++) scanf("%lld",&m.a[i][j]);
		m=ksm(m,k);
		m.Print();
	return 0;
}