洛谷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.

浙公网安备 33010602011771号