考虑到$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. Dubbo学习笔记10:Dubbo服务消费方启动流程源码分析

    同理我们看下服务消费端启动流程时序图: 在<Dubbo整体架构分析>一文中,我们提到服务消费方需要使用ReferenceConfig API来消费服务,具体是调用代码(1)get()方法来 ...

  2. bzoj千题计划294:bzoj3139: [Hnoi2013]比赛

    http://www.lydsy.com/JudgeOnline/problem.php?id=3139 队伍的顺序不会影响结果 将队伍的得分情况作为状态,记忆化搜索 就是先搜索第一只队伍的得分情况, ...

  3. bzoj千题计划221:bzoj1500: [NOI2005]维修数列(fhq treap)

    http://www.lydsy.com/JudgeOnline/problem.php?id=1500 1.覆盖标记用INF表示无覆盖标记,要求可能用0覆盖 2.代表空节点的0号节点和首尾的两个虚拟 ...

  4. .NET面试题系列(五)数据结构(Array、List、Queue、Stack)及线程安全问题

    常用数据结构的时间复杂度 如何选择数据结构 Array (T[]) 当元素的数量是固定的,并且需要使用下标时. Linked list (LinkedList<T>) 当元素需要能够在列表 ...

  5. 移动端网页开发 meta 之 viewport

    这几天在搞微信公众平台,涉及到几个页面要写,可是当我测试时发现和想象中不太一样,于是去找了几个页面看了下,发现他们页面头部有 meta viewport 的标签,所以去找了下网上的资料,发现千篇一律, ...

  6. [转载]必须Mark!最佳HTML5应用开发工具推荐

    http://www.csdn.net/article/2014-04-25/2819503-10-html5-tools-worth-checking-out/2 摘要:HTML5自诞生以来,作为新 ...

  7. git的权威指南

    CHENYILONG 博客 git的权威指南 全屏 © chenyilong.本站由Postach.io 博客

  8. [转]避免头文件重复包含以及#ifndef 与 #program once 的区别

    为了避免同一个文件被include多次,C/C++中有两种方式,一种是#ifndef方式,一种是#pragma once方式.在能够支持这两种方式的编译器上,二者并没有太大的区别,但是两者仍然还是有一 ...

  9. Linux 抽象网络设备简介

    Linux 抽象网络设备简介 和磁盘设备类似,Linux 用户想要使用网络功能,不能通过直接操作硬件完成,而需要直接或间接的操作一个 Linux 为我们抽象出来的设备,既通用的 Linux 网络设备来 ...

  10. MongoDB 3.x 安装及权限验证

    1.首先在网上下载MongoDB的安装包,我这边使用的是3.2版本: 2.安装MongoDB安装程序,安装完成后设置环境变量,我这边的安装路径是:“C:\Program Files\MongoDB\S ...