矩阵乘法-vijos1603迷宫
https://vijos.org/p/1603
你想啊
a[i][j]代表i到j的方案树;
显然
a[i][j]+=a[i][k]*a[j][k]
这个就是矩阵的基本性质啊;
这个就是floyd啊;
和Fop_zz刷了几道vijos感觉很好啊;
省选题都是码农题啊;
vijos代码量不打,却很巧,右接近noip++啊;
算了我继续刷洛谷
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cstdlib>
#include<cmath>
#include<map>
#define Ll long long
using namespace std;
struct mat{
int m[55][55];
}a,c,ans;
int n,m,S,E,mo;
mat cheng(mat a,mat b){
memset(c.m,0,sizeof c.m);
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
for(int k=1;k<=n;k++)
c.m[i][j]=(c.m[i][j]+a.m[i][k]*b.m[k][j])%mo;
return c;
}
int main()
{
scanf("%d",&n);
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)cin>>a.m[i][j];
ans=a;
scanf("%d%d%d%d",&m,&S,&E,&mo);
m--;
while(m){
if(m&1)ans=cheng(a,ans);
m=m>>1;
a=cheng(a,a);
}
printf("%d",ans.m[S][E]);
}