洛谷P3390——矩阵快速幂 题解

如果你打开这篇博客,那么我就默认你已经学会了二维矩阵。

(关于矩阵的介绍我会再抽出一篇博客来讲)

那么既然大家已经会了矩阵和二维矩阵的相乘那么我就直接搬运AC代码了!

在看代码之前我们先关注几个点:

1.关于矩阵的乘法我们最好直接使用重载运算符的方法,这样的话可以使得代码的可读性变得很高并且使得代码十分简洁。

2.千万千万要注意数据范围(这道题的数据范围在longlong范围内所以一定要注意审题)

#include<bits/stdc++.h>
#define esp 1000000007
#define int long long
using namespace std;
struct matry{
	int w[101][101]={{0,0}};
	int rows=0,columns=0;//行数和列数 
	friend matry operator * (matry x,matry y){
		matry z;
		memset(z.w,0,sizeof(z.w));
		z.rows=x.rows;
		z.columns=y.columns;
		if(x.columns!=y.rows){
			return z;
		}
		else{
			for(int i=1;i<=x.rows;i++){
				for(int j=1;j<=y.columns;j++){
					for(int k=1;k<=x.columns;k++){
						z.w[i][j]+=(x.w[i][k]*y.w[k][j]);
						z.w[i][j]%=esp;
					}
				}
			}
		}
		return z;
	}
}a;
int n,k;
matry mksm(matry x,int y){
	matry z;
	memset(z.w,0,sizeof(z.w));
	if(y==1) return x;
	z=mksm(x,y/2);
	z=z*z;
	if(y&1){
		 return x*z;
	}
	else{
		return z;
	}
}
signed main(){
	scanf("%lld%lld",&n,&k);
	a.rows=n;
	a.columns=n;
	for(int i=1;i<=n;i++){
		for(int j=1;j<=n;j++){
			scanf("%lld",&a.w[i][j]);
		}
	}
	matry q=mksm(a,k);
	for(int i=1;i<=n;i++){
		for(int j=1;j<=n;j++){
			printf("%lld ",q.w[i][j]);
		}
		puts("");
	}
	return 0;
}

 

End.

posted @ 2020-03-21 18:13  Robertspot  阅读(211)  评论(1编辑  收藏  举报