如果你的 k 大于12就错了,那你可能是 k 没有除以12
12步一轮只需要走 ⌊12k⌋ 步。。(调了三个小时)
#include<bits/stdc++.h>
#define ll long long
#define rev(x) reverse(x.begin(),x.end())
using namespace std;
const int mod=10000;
struct matrix{
int n,m;
int mt[60][60];
matrix(){n=m=0;memset(mt,0,sizeof mt);}
matrix operator*(const matrix&q)const{
matrix ans;ans.n=n,ans.m=q.m;
for(int i=0;i<n;i++)
for(int j=0;j<q.m;j++)
for(int k=0;k<m;k++)
ans.mt[i][j]=(ans.mt[i][j]+mt[i][k]*q.mt[k][j])%mod;
return ans;
}
void operator*=(const matrix&q){*this=*this*q;}
void print(){
for(int i=0;i<n;i++){
for(int j=0;j<m;j++) cout<<mt[i][j]<<" ";
cout<<endl;
}
cout<<"-----\n";
}
}trans[12],ty;
int n,m,st,nd,TIM;
int main(){
ios::sync_with_stdio(false);
cin.tie(0),cout.tie(0);
cin>>n>>m>>st>>nd>>TIM;
ty.n=n,ty.m=n;
for(int i=1;i<=m;i++){
int a,b;cin>>a>>b;
ty.mt[a][b]=ty.mt[b][a]=1;
}
for(int i=0;i<12;i++) trans[i]=ty;
int nfish;cin>>nfish;
for(int i=1;i<=nfish;i++){
int p;cin>>p;
int lis[10]={};
for(int j=0;j<p;j++) cin>>lis[j];
for(int k=0;k<12;k++) for(int j=0;j<n;j++) trans[k].mt[j][lis[(k+1)%p]]=0;
}
matrix transSUM=trans[0];
for(int i=1;i<12;i++) transSUM*=trans[i];
matrix frm;
frm.n=1,frm.m=n;
frm.mt[0][st]=1;
int ttt=TIM%12;
TIM-=ttt;
TIM/=12; //这里(!!
while(TIM){
if(TIM&1) frm*=transSUM;
transSUM*=transSUM;
TIM>>=1;
}
for(int i=0;i<ttt;i++) frm*=trans[i];
cout<<frm.mt[0][nd];
return 0;
}