题解
-
鱼的周期只为2,3,4,所以最多12步一个周期
-
我们可以把每一时刻的邻接矩阵相乘,便可知道路径的数目
-
当a[i,k]>0,b[k,j]>0时,即i—>k和k—>j都有路径时c[I,j]才有路径,且等于实际i—j的路径
-
然后把矩阵处理出来就可以做了
代码
1 #include <cstdio> 2 #include <iostream> 3 #include <cstring> 4 #define ll long long 5 using namespace std; 6 struct jz 7 { 8 int n,m; 9 ll a[110][110]; 10 jz(){n=m=0,memset(a,0,sizeof(a));} 11 }a,c,ans; 12 int n,m,k,s,e,Q,mo=1e4,f[210][110]; 13 bool bz[510]; 14 jz cheng(jz a,jz b) 15 { 16 jz r; r.n=a.n,r.m=b.m; 17 for (int i=1;i<=a.n;i++) 18 for (int j=1;j<=a.m;j++) 19 if (a.a[i][j]) 20 for (int k=1;k<=b.m;k++) 21 if (!bz[k]) 22 r.a[i][k]=(r.a[i][k]+a.a[i][j]*b.a[j][k])%mo; 23 return r; 24 } 25 jz ksm(int x) 26 { 27 jz r=c,a=c; x--; 28 for (;x;x>>=1) { if (x&1) r=cheng(r,a); a=cheng(a,a); } 29 return r; 30 } 31 void make(int x) 32 { 33 x++,memset(bz,0,sizeof(bz)); 34 for (int i=1,p;i<=Q;i++) p=x%f[i][0],p=!p?f[i][0]:p,bz[f[i][p]]=1; 35 } 36 int main() 37 { 38 scanf("%d%d%d%d%d",&n,&m,&s,&e,&k),a.n=a.m=c.n=c.m=ans.n=ans.m=n; 39 for (int i=1,x,y;i<=m;i++) scanf("%d%d",&x,&y),x++,y++,a.a[x][y]=a.a[y][x]=1; 40 scanf("%d",&Q); 41 for (int i=1;i<=Q;i++) 42 { 43 scanf("%d",&f[i][0]); 44 for (int j=1;j<=f[i][0];j++) scanf("%d",&f[i][j]),f[i][j]++; 45 } 46 for (int i=1;i<=n;i++) c.a[i][i]=ans.a[i][i]=1; 47 for (int i=1;i<=12;i++) make(i),c=cheng(c,a); 48 memset(bz,0,sizeof(bz)); 49 if (k>=12) ans=ksm(k/12); 50 for (int i=1;i<=k%12;i++) make(i),ans=cheng(ans,a); 51 printf("%lld",ans.a[++s][++e]); 52 }