没有食人鱼:直接矩乘优化
有食人鱼:食人鱼周期2、3、4,公倍数12,可以以12为一个周期矩乘,剩下的暴力
注意矩乘不满足乘法交换律,一定要注意乘的顺序
#include<iostream> #include<cstdio> #include<cstring> using namespace std; int n,m,S,T,K,d[7]; struct mat{ int a[52][52]; mat(){memset(a,0,sizeof(a));} mat operator * (const mat &G) const{ mat c; for(int i=0;i<n;++i) for(int j=0;j<n;++j) for(int k=0;k<n;++k) c.a[i][j]=(c.a[i][j]+a[i][k]*G.a[k][j]%10000)%10000; return c; } }s,f[14],w; mat Pow(mat x,int y){ mat re; for(int i=0;i<n;++i) re.a[i][i]=1; for(;y;y>>=1,x=x*x) if(y&1) re=re*x; return re; } int main(){ scanf("%d%d%d%d%d",&n,&m,&S,&T,&K); for(int i=1,u,v;i<=m;++i){ scanf("%d%d",&u,&v); s.a[u][v]=s.a[v][u]=1; } for(int i=0;i<12;++i) f[i]=s; scanf("%d",&m); for(int i=1,t;i<=m;++i){ scanf("%d",&t); for(int u=0;u<t;++u) scanf("%d",&d[u]); for(int j=0;j<12;++j) for(int k=0;k<n;++k) f[j].a[k][d[j%t]]=0; } for(int i=0;i<n;++i) w.a[i][i]=1; for(int i=1;i<12;++i) w=w*f[i]; w=w*f[0]; w=Pow(w,K/12); for(int i=1;i<=K%12;++i) w=w*f[i]; printf("%d",w.a[S][T]); return 0; }