Title
Solution
注意题目说“所以他不会立刻沿着刚刚走来的路走回”!!!
对于这个条件,我们可以把边当作点,
A
:
x
→
y
A:x\rightarrow y
A:x→y
B
:
y
→
z
B:y\rightarrow z
B:y→z
可以把
A
A
A连向
B
B
B,对于同一条边的两点不要相连可以处理。
Code
#include<cstdio>
#include<algorithm>
#include<string>
#include<cstring>
#define rep(i,x,y) for(int i=x;i<=y;i++)
using namespace std;
const int N=155,mod=45989;
int n,m,t,s,e;
int xx[N],yy[N],tot,cnt;
struct Matrix{
int a[N][N];
Matrix operator *(Matrix const &b) const{
Matrix c; memset(c.a,0,sizeof(c.a));
rep(i,1,tot) rep(j,1,tot) rep(k,1,tot) c.a[i][j]=(c.a[i][j]+a[i][k]*b.a[k][j]%mod)%mod;
return c;
}
}f,ans;
int read(){
int p=0; char c=getchar();
while (!isdigit(c)) c=getchar();
while (isdigit(c)) p=(p<<3)+(p<<1)+c-48,c=getchar();
return p;
}
int main(){
n=read(),m=read(),t=read(),s=read(),e=read(); s++,e++;
xx[++tot]=0,yy[tot]=s;
rep(i,1,m){
int x=read()+1,y=read()+1;
xx[++tot]=x,yy[tot]=y;
xx[++tot]=y,yy[tot]=x;
}
rep(i,1,tot) ans.a[i][i]=1;
rep(i,1,tot) rep(j,1,tot) if (i!=j&&i!=(j^1)){ if (yy[i]==xx[j]) f.a[i][j]=1; }
for(;t;t>>=1,f=f*f) if (t&1) ans=ans*f;
rep(i,1,tot) if (yy[i]==e) cnt=(cnt+ans.a[1][i])%mod;
printf("%d",cnt);
return 0;
}