题目背景
矩阵快速幂

题目描述
给定 n \(\times\) n的矩阵A,求\({A^k}\)

输入格式
第一行两个整数n,k接下来n行,每行n个整数,第i行的第j个数表示\({A_{i,j}}\).

输出格式
输出\({A^k}\)
共n行,每行n个数,第i行第j个数表示\(\langle{A^k}\rangle_{i,j}\),每个元素对\(10^9+7\)取模。

输入输出样例

输入#1    输出#1
2 1       1 1
1 1       1 1
1 1

说明/提示
对于100%的数据:1<=n<=100,0<=k<=\(10^{12}\)
|\(A_{i,j}\)|<=1000

#include<cstdio>
#include<cstring>
#define ll long long

using namespace std;

int n;
long long mod=1000000007;

struct matrix
{
	ll a[105][105];
	matrix()
	{
		memset(a,0,sizeof(a));
	}
	inline void build()
	{
		for(int i=1;i<=n;i++)
			a[i][i]=1;	
	}	
}a;

matrix operator * (const matrix &x,const matrix &y)
{
	matrix z;
	for(int k=1;k<=n;k++)
		for(int i=1;i<=n;i++)
			for(int j=1;j<=n;j++)
				z.a[i][j]=(z.a[i][j]+x.a[i][k]*y.a[k][j]%mod)%mod;
	return z;
}

ll k;

int main()
{
	scanf("%d%lld",&n,&k);
	for(int i=1;i<=n;i++)
		for(int j=1;j<=n;j++)
			scanf("%lld",&a.a[i][j]);
	matrix ans;
	ans.build();
	do{
		if(k&1)
			ans=ans*a;
		a=a*a;
		k>>=1;
	}while(k);
	for(int i=1;i<=n;i++)
	{
		for(int j=1;j<=n;j++)
			printf("%d ",ans.a[i][j]);
		printf("\n");
	}	
	return 0;	
}
posted on 2020-07-14 11:21  Allen_lml  阅读(117)  评论(0编辑  收藏  举报