由于不能走来时的边,可以把边转化成点,其余就是裸的矩阵乘法了。
#include<iostream>
#include<cstdio>
#include<cstring>
#define M 125
#define P 45989
using namespace std;
int n,m,t,a,b,cnt,sum;
int head[25];
int list[M],next[M],from[M];
inline int read()
{
int a=0,f=1; char c=getchar();
while (c<'0'||c>'9') {if (c=='-') f=-1; c=getchar();}
while (c>='0'&&c<='9') {a=a*10+c-'0'; c=getchar();}
return a*f;
}
struct Matrix
{
int a[M][M];
Matrix()
{
memset(a,0,sizeof(a));
}
friend Matrix operator*(Matrix a,Matrix b)
{
Matrix ans;
for (int i=0;i<=cnt;i++)
for (int j=0;j<=cnt;j++)
for (int k=0;k<=cnt;k++)
(ans.a[i][j]+=a.a[i][k]*b.a[k][j]%P)%=P;
return ans;
}
friend Matrix operator^(Matrix a,int b)
{
Matrix ans;
for (int i=0;i<=cnt;i++) ans.a[i][i]=1;
for (;b;b>>=1,a=a*a)
if (b&1) ans=ans*a;
return ans;
}
};
Matrix A,ans;
inline void insert(int x,int y)
{
next[++cnt]=head[x];
head[x]=cnt;
from[cnt]=x;
list[cnt]=y;
}
int main()
{
n=read(); m=read(); t=read(); a=read()+1; b=read()+1;
for (int i=1;i<=m;i++)
{
int u=read()+1,v=read()+1;
insert(u,v); insert(v,u);
}
for (int i=head[a];i;i=next[i])
ans.a[0][i]++;
for (int i=1;i<=cnt;i++)
for (int j=head[list[i]];j;j=next[j])
if (j!=i+((i&1)?1:-1)) A.a[i][j]++;
A=A^(t-1);
ans=ans*A;
for (int i=1;i<=cnt;i++)
if (list[i]==b)
(sum+=ans.a[0][i])%=P;
cout << sum << endl;
return 0;
}