vijosP1603迷宫

时间:2023-03-09 16:00:09
vijosP1603迷宫

vijosP1603迷宫

链接:https://vijos.org/p/1603

【思路】

参考Matrix67的文章:

vijosP1603迷宫

【代码】

 #include<cstdio>
#include<cstring>
#include<iostream>
#define FOR(a,b,c) for(int a=(b);a<(c);a++)
using namespace std; const int maxn = +;
typedef long long LL; int n,m,MOD; struct Matrix{
int r,c;
LL N[maxn][maxn];
void init(int r,int c) {
this->r=r, this->c=c;
memset(N,,sizeof(N));
}
Matrix operator*(Matrix& B)const{
Matrix A=*this,C;
C.init(A.r,B.c);
for(int i=;i<C.r;i++)
for(int j=;j<C.c;j++)
for(int k=;k<A.c;k++)
C.N[i][j] = (C.N[i][j]+A.N[i][k]*B.N[k][j])%MOD;
return C;
}
Matrix pow(int p) {
Matrix tmp=*this;
Matrix ans;
ans.init(r,r);
for(int i=;i<r;i++) ans.N[i][i]=;
while(p) {
if(p&) ans=ans*tmp;
tmp=tmp*tmp;
p>>=;
}
return ans;
}
};
int main() {
int s,t;
scanf("%d",&n);
Matrix ans;
ans.init(n,n);
FOR(i,,n)FOR(j,,n) scanf("%d",&ans.N[i][j]);
scanf("%d%d%d%d",&m,&s,&t,&MOD);
ans=ans.pow(m);
printf("%d\n",ans.N[s-][t-]);
return ;
}