记录编号 361248 评测结果 AAAAAAAAAA
题目名称 [ZJOI 2005] 沼泽鳄鱼 最终得分 100
用户昵称 GravatarFoolMike 是否通过 通过
代码语言 C++ 运行时间 0.181 s
提交时间 2017-01-03 15:40:18 内存使用 5.53 MiB
显示代码纯文本
#include<cstdio>
#include<cstring>
using namespace std;
const int N=110,mod=10000;
int n,m,s,t,k,nfish,cnt,sit[N][N][N];
bool go[N][N],vis[N][N];
struct matrix{
	int a[N][N];
	matrix(){memset(a,0,sizeof a);}
	void operator *= (const matrix x){
		matrix ans;
		for (int i=0;i<n;i++)
		for (int j=0;j<n;j++)
		for (int k=0;k<n;k++)
			(ans.a[i][j]+=a[i][k]*x.a[k][j])%=mod;
		memcpy(a,ans.a,sizeof a);
	}
}x,ans,I;
matrix mi(matrix x,int y){
	matrix ans=I;
	for (;y;y>>=1,x*=x)
		if (y&1) ans*=x;
	return ans;
}
int P(int x,int y){return x*12+y;}
int main()
{
	freopen("swamp.in","r",stdin);
	freopen("swamp.out","w",stdout);
	scanf("%d%d%d%d%d",&n,&m,&s,&t,&k);
	for (int i=0;i<n;i++) I.a[i][i]=1;
	for (int i=0;i<m;i++){
		int x,y;
		scanf("%d%d",&x,&y);
		go[x][y]=go[y][x]=1;
	}
	scanf("%d",&nfish);
	for (int i=1,T,p;i<=nfish;i++){
		scanf("%d",&T);
		for (int i=0;i<T;i++){
			scanf("%d",&p);
			for (int j=i;j<=12;j+=T) vis[p][j]=1;
		}
	}
	for (int s=0;s<n;s++){
		sit[s][s][0]=1;
		for (int T=0;T<12;T++)
		for (int i=0;i<n;i++)
		for (int j=0;j<n;j++)
		if (go[i][j]&&!vis[j][T+1])
			(sit[s][j][T+1]+=sit[s][i][T])%=mod;
		for (int i=0;i<n;i++)
			x.a[s][i]=sit[s][i][12];
	}
	ans.a[0][s]=1;
	ans*=mi(x,k/12);k%=12;
	int Ans=0;
	for (int i=0;i<n;i++)
		(Ans+=ans.a[0][i]*sit[i][t][k])%=mod;
	printf("%d\n",Ans);
	return 0;
}