考虑到$lcm(1,2,3,4,5,6)=60$,所以操作序列每60秒一个循环。

将操作表示成转移矩阵的形式,预处理出前60秒的转移矩阵以及它们的乘积$B$。

那么t秒的转移矩阵为前$t\bmod 60$个转移矩阵的乘积乘以$B^{\lfloor\frac{t}{60}\rfloor}$。

用矩阵快速幂加速计算即可。

#include<cstdio>
#include<cstring>
#define rep(i,n) for(int i=0;i<n;i++)
#define P 65
typedef long long ll;
int n,m,t,q,i,j,k,x,y,N,id[P][P],a[P][P],l[P];char s[P],b[P][P],c;ll ans;
struct mat{
ll a[P][P];
mat(){rep(i,P)rep(j,P)a[i][j]=0;}
inline mat operator*(mat b){
mat c;
rep(i,N)rep(j,N)rep(k,N)c.a[i][j]+=a[i][k]*b.a[k][j];
return c;
}
}one,A[P],pre[P],B,C,D;
int main(){
scanf("%d%d%d%d",&n,&m,&t,&q);
for(i=1;i<=n;i++)for(scanf("%s",s+1),j=1;j<=m;j++)id[i][j]=++N,a[i][j]=s[j]-'0';N++;
for(i=0;i<q;i++)scanf("%s",b[i]+1),l[i]=std::strlen(b[i]+1),b[i][0]=b[i][l[i]];
rep(i,N)one.a[i][i]=1;
for(pre[0]=one,i=1;i<=60;i++){
A[i].a[0][0]=1;
for(j=1;j<=n;j++)for(k=1;k<=m;k++){
c=b[a[j][k]][i%l[a[j][k]]];
if(c>='0'&&c<='9')A[i].a[id[j][k]][0]=c-'0',A[i].a[id[j][k]][id[j][k]]++;
if(c=='N'){
x=j-1,y=k;
if(x>=1)A[i].a[id[x][y]][id[j][k]]++;
}
if(c=='S'){
x=j+1,y=k;
if(x<=n)A[i].a[id[x][y]][id[j][k]]++;
}
if(c=='W'){
x=j,y=k-1;
if(y>=1)A[i].a[id[x][y]][id[j][k]]++;
}
if(c=='E'){
x=j,y=k+1;
if(y<=m)A[i].a[id[x][y]][id[j][k]]++;
}
}
pre[i]=A[i]*pre[i-1];
}
for(B=pre[60],C=one,k=t/60;k;k>>=1,B=B*B)if(k&1)C=C*B;
for(D.a[0][0]=1,D=pre[t%60]*C*D,i=1;i<N;i++)if(ans<D.a[i][0])ans=D.a[i][0];
return printf("%lld",ans),0;
}

  

BZOJ2973 : 石头游戏的更多相关文章

  1. bzoj2973石头游戏——矩阵乘法

    题目:权限题! 写了一下,但提交不了,先放着吧. 代码如下: #include<iostream> #include<cstdio> #include<cstring&g ...

  2. 【BZOJ2973】石头游戏 矩阵乘法

    [BZOJ2973]石头游戏 Description 石头游戏的规则是这样的. 石头游戏在一个n行m列的方格阵上进行.每个格子对应了一个编号在0~9之间的操作序列. 操作序列是一个长度不超过6且循环执 ...

  3. CH3401 石头游戏(矩阵快速幂加速递推)

    题目链接:传送门 题目: 石头游戏 0x30「数学知识」例题 描述 石头游戏在一个 n 行 m 列 (≤n,m≤) 的网格上进行,每个格子对应一种操作序列,操作序列至多有10种,分别用0~9这10个数 ...

  4. 【BZOJ2000】[HNOI2000]取石头游戏(贪心,博弈论)

    [BZOJ2000][HNOI2000]取石头游戏(贪心,博弈论) 题面 BZOJ 洛谷 题解 这题好神仙啊,窝不会QaQ. 假装一下只有三个元素\(a_{i-1},a_i,a_{i+1}\),并且满 ...

  5. CH 3401 - 石头游戏 - [矩阵快速幂加速递推]

    题目链接:传送门 描述石头游戏在一个 $n$ 行 $m$ 列 ($1 \le n,m \le 8$) 的网格上进行,每个格子对应一种操作序列,操作序列至多有 $10$ 种,分别用 $0 \sim 9$ ...

  6. CH3401 石头游戏

    题意 3401 石头游戏 0x30「数学知识」例题 描述 石头游戏在一个 n 行 m 列 (1≤n,m≤8) 的网格上进行,每个格子对应一种操作序列,操作序列至多有10种,分别用0~9这10个数字指明 ...

  7. [luogu] P3210 [HNOI2010]取石头游戏(贪心)

    P3210 [HNOI2010]取石头游戏 题目描述 A 公司正在举办一个智力双人游戏比赛----取石子游戏,游戏的获胜者将会获得 A 公司提供的丰厚奖金,因此吸引了来自全国各地的许多聪明的选手前来参 ...

  8. 7月18日刷题记录 二分答案跳石头游戏Getting

    通过数:1 明天就要暑假编程集训啦~莫名开心 今天做出了一道 二分答案题(好艰辛鸭) 1049: B13-二分-跳石头游戏(二分答案) 时间限制: 5 Sec  内存限制: 256 MB提交: 30  ...

  9. 牛客1024B 石头游戏

    题目描述 石头游戏在一个 \(n\) 行 \(m\) 列 \((1\leq n,m \leq 8)(1≤n,m≤8)\) 的网格上进行,每个格子对应一种操作序列,操作序列至多有10种,分别用0~9这1 ...

随机推荐

  1. vue-cli构建项目使用 less

    在vue-cli中构建的项目是可以使用less的,但是查看package.json可以发现,并没有less相关的插件,所以我们需要自行安装. 第一步:安装 npm install less less- ...

  2. ASP.NET MVC学习(四)之视图View

    1.视图 2.强类型视图 3.@RenderSection("HeaderSection", false)     @RenderBody() 4.子行为 5.ASP.NET MV ...

  3. ASP.NET MVC学习(一)之路由篇Route

    什么是路由 通过[路由]配置,路由可以规定URL的特殊格式,使其达到特殊效果. 在ASP.NET MVC框架中,通过路由配置URL,使用户的URL请求可以映射到Controller下的action方法 ...

  4. 《Linux命令行与shell脚本编程大全》23章24章

    第二十三章 使用其他shell bash shell是linux发行版中最广泛使用的shell.但是它并不是唯一的选择,还有其他的shell可以供你选择. 23.1 什么是dash shell 百度百 ...

  5. [转载]VS2013 密钥 – 所有版本

    http://www.wxzzz.com/307.html Visual Studio Ultimate 2013 KEY(密钥):BWG7X-J98B3-W34RT-33B3R-JVYW9 Visu ...

  6. 被误解的 Node.js

    http://www.ibm.com/developerworks/cn/web/1201_wangqf_nodejs/ 被误解的 Node.js

  7. Python核心编程——Chapter16

    好吧,在拜读完<Python网络编程基础>之后,回头再搞一搞16章的网络编程吧. Let‘s go! 16.4.修改书上示例的TCP和UDP客户端,使得服务器的名字不要在代码里写死,要允许 ...

  8. Linux 并发链接数

    并发数查看   查看 TCP 协议连接数 netstat -n | awk '/^tcp/ {++S[$NF]} END {for(a in S) print a, S[a]}' SYN_RECV # ...

  9. 基于Disruptor并发框架的分类任务并发

    并发的场景 最近在编码中遇到的场景,我的程序需要处理不同类型的任务,场景要求如下: 1.同类任务串行.不同类任务并发. 2.高吞吐量. 3.任务类型动态增减. 思路 思路一: 最直接的想法,每有一个任 ...

  10. shell函数中eof报错(warning: here-document at line 9 delimited by end-of-file (wanted `EOF'))

    在shell编写函数时,函数中有eof和EOF,如果是在sublime编写按照格式tab缩进会有以下报错 解决办法: 取消函数中的tab缩进,在运行即可