注意到周期234的lcm只有12,也就是以12为周期,可以走的状态是一样的

所以先预处理出这12个状态的转移矩阵,乘起来,然后矩阵快速幂优化转移k/12次,然后剩下的次数暴力转移即可

#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
const int mod=10000;
int n,m,s,t,k,x,y,nf,T,w[60];
struct jz
{
int a[60][60];
jz operator * (jz y)
{
jz c;
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
{
c.a[i][j]=0;
for(int k=1;k<=n;k++)
c.a[i][j]=(c.a[i][j]+a[i][k]*y.a[k][j])%mod;
}
return c;
}
}a,b[15],ans;
int main()
{
scanf("%d%d%d%d%d",&n,&m,&s,&t,&k);
s++;t++;
for(int i=1;i<=m;i++)
{
scanf("%d%d",&x,&y);
x++;y++;
for(int j=1;j<=12;j++)
b[j].a[x][y]=b[j].a[y][x]=1;
}
scanf("%d",&nf);
for(int i=1;i<=nf;i++)
{
scanf("%d",&T);
for(int j=1;j<=T;j++)
scanf("%d",&w[j]),w[j]++;
for(int j=1;j<=12;j++)
for(int k=1;k<=n;k++)
b[j].a[k][w[j%T+1]]=0;
}
for(int i=1;i<=n;i++)
a.a[i][i]=1,ans.a[i][i]=1;
for(int i=1;i<=12;i++)
a=a*b[i];
int kk=k/12;
while(kk)
{
if(kk&1)
ans=ans*a;
a=a*a;
kk>>=1;
}
for(int i=1;i<=k%12;i++)
ans=ans*b[i];
printf("%d",ans.a[s][t]);
return 0;
}

最新文章

  1. 记录在Windows上安装和使用Oracle数据库过程中的坑
  2. mysql 慢查询的小结
  3. [转]Java连接各种数据库的方法
  4. js获取文件大小
  5. 将text 文件转为List
  6. codeforces 713C C. Sonya and Problem Wihtout a Legend(dp)
  7. Apache Spark技术实战之2 -- PackratParsers实例
  8. 遇到困难 jsp代码onclick=&quot;javascript:return(checklogin());&quot;报错
  9. c语言中数组相关问题
  10. 数据操作So easy-LINQ解析
  11. bzoj1197
  12. Android--广播BroadcastReceiver
  13. Cocos2d-x 3.0 创建一个场景,并设置现场的时候,项目开始执行上主动
  14. [SinGuLaRiTy] 最短路计算代码库
  15. (转)什么是P问题、NP问题和NPC问题
  16. java jdk中安装证书的步骤
  17. PHP / Laravel 月刊 #23
  18. 01-oracle学习环境配置
  19. FinalHttp的简要介绍与使用
  20. css动画和js动画的差异

热门文章

  1. Spring中实现自定义事件
  2. [转] SQL SERVER 2008 R2 安装中的账户设置问题
  3. 附加数据库时,提示“Microsoft SQL Server,错误: 5120”, 解决方案
  4. Jinja2如何默认将None 值显示为空字符串?
  5. NoSQL之Memcached
  6. 【转】 一张图看懂开源许可协议,开源许可证GPL、BSD、MIT、Mozilla、Apache和LGPL的区别
  7. USACO castle
  8. Unity Critter地图导出到server配置
  9. instancetype VS id
  10. 【Mongodb教程 第九课 】MongoDB 删除文档