没过样例,ou函数是输出矩阵检测用的
#include<bits/stdc++.h>
using namespace std;
struct matrix{
int m[55][55],x,y;
matrix(){x=0;y=0;memset(m,0,sizeof(m));}
inline void init(){memset(m,0,sizeof(m));for(int i=0;i<=x;i++)m[i][i]=1;}
}now,f[14];
int n,m,s,e,k,nfish;
matrix ti(matrix a,matrix b){
matrix c;c.x=b.x,c.y=a.y;
for(int i=1;i<=a.y;i++){
for(int j=1;j<=b.x;j++){
for(int k=1;k<=a.x;k++){
c.m[i][j]=(c.m[i][j]+(a.m[i][k]%10000)*(b.m[k][j]%10000))%10000;
}
}
}
return c;
}
matrix pow_m(matrix a,int k){
matrix ans;ans.x=ans.y=a.x;ans.init();
while(k){if(k&1){ans=ti(ans,a);}k>>=1;a=ti(a,a);}
return ans;
}
void ou(matrix a){
for(int i=1;i<=a.x;i++){
for(int j=1;j<=a.y;j++){
cout<<a.m[i][j]<<" ";
}
cout<<endl;
}
}
int main(){
cin>>n>>m>>s>>e>>k;
now.x=now.y=n;
for(int i=1,x,y;i<=m;i++){
cin>>x>>y;
now.m[x+1][y+1]=now.m[y+1][x+1]=1;
}
cin>>nfish;
for(int i=1;i<=12;i++)f[i]=now;
for(int i=1,t;i<=nfish;i++){
cin>>t;
for(int j=1,now;j<=t;j++){
cin>>now;now++;
for(int k=j;k<=12;k+=t){
for(int l=1;l<=n;l++){
f[k].m[l][now]=0;
}
}
}
}
f[13]=f[1]; now.init();
for(int i=2;i<=12;i++)f[13]=ti(f[13],f[i]);
now=pow_m(f[13],k/12);
for(int i=1;i<=k%12;i++){
now=ti(now,f[i]);
}
cout<<now.m[s+1][e+1];
return 0;
}