【BZOJ2973】石头游戏

Description

石头游戏的规则是这样的。
石头游戏在一个n行m列的方格阵上进行。每个格子对应了一个编号在0~9之间的操作序列。
操作序列是一个长度不超过6且循环执行、每秒执行一个字符的字符串。它包括:
数字0~9:拿0~9个石头到该格子。
NWSE:把这个格子内所有的石头推到相邻的格子。
D:拿走这个格子的石头。
石头游戏的问题是:当这个石头游戏进行了t秒之后,所有方格中最多的格子有多少个石头。
注意:所有格子的操作同时执行。

Input

第一行三个整数n, m, t, act。
接下来n行,每行m个字符,表示每个格子对应的操作序列。
最后act行,每行一个字符串,表示从0开始的每个操作序列。

Output

一个整数:游戏进行了t秒之后,所有方格中最多的格子有多少个石头。

Sample Input

1 6 10 3
011112
1E
E
0

Sample Output

3
【样例解释】
这是另一个类似于传送带的结构。左边的设备0间隔地产生石头并向东传送。设备1向右传送,直到设备2。10秒后,总共产生了5个石头,2个在传送带上,3个在最右边。
【数据约定】
0≤n, m≤8。
1≤act≤10。
1≤t≤10^9。

题解:跟沼泽鳄鱼那道题差不多,只不过周期变成了60。那我们构造60个转移矩阵f[0..59],它们的乘积为x。那么ans=x^(T/12)*f[0..T%12]。至于怎么构造矩阵。。自己yy一下就好了吧?

又一次get了惨痛的历史教训,矩乘不满足交换律,所以一定要先ans*=x^(T/12)再ans*=f[0..T%12]。

#include <cstdio>
#include <cstring>
#include <iostream>
#define P(A,B) ((A-1)*m+B)
using namespace std;
typedef long long ll;
typedef struct matrix
{
ll v[100][100];
}M;
M ans,x,emp,f[65];
int n,m,tim,act;
int len[20];
ll maxx;
char A[20][20],B[20][20],ch;
M mmul(M a,M b)
{
M c=emp;
int i,j,k;
for(i=0;i<=n*m;i++)
for(j=0;j<=n*m;j++)
for(k=0;k<=n*m;k++)
c.v[i][j]+=a.v[i][k]*b.v[k][j];
return c;
}
void pm(int y)
{
while(y)
{
if(y&1) ans=mmul(ans,x);
x=mmul(x,x),y>>=1;
}
}
int main()
{
scanf("%d%d%d%d",&n,&m,&tim,&act);
int i,j,k,l,a,b;
for(i=1;i<=n;i++) scanf("%s",A[i]);
for(i=0;i<act;i++) scanf("%s",B[i]),len[i]=strlen(B[i]);
for(i=0;i<=n*m;i++) x.v[i][i]=1;
ans.v[0][0]=1;
for(l=0;l<60;l++)
{
f[l].v[0][0]=1;
for(i=1;i<=n;i++)
{
for(j=1;j<=m;j++)
{
k=A[i][j-1]-'0',ch=B[k][l%len[k]];
if(ch>='0'&&ch<='9') f[l].v[P(i,j)][P(i,j)]=1,f[l].v[0][P(i,j)]=ch-'0';
if(ch=='N'&&i>1) f[l].v[P(i,j)][P(i-1,j)]=1;
if(ch=='W'&&j>1) f[l].v[P(i,j)][P(i,j-1)]=1;
if(ch=='S'&&i<n) f[l].v[P(i,j)][P(i+1,j)]=1;
if(ch=='E'&&j<m) f[l].v[P(i,j)][P(i,j+1)]=1;
}
}
x=mmul(x,f[l]);
}
pm(tim/60);
for(i=0;i<tim%60;i++) ans=mmul(ans,f[i]);
for(i=1;i<=n*m;i++) maxx=max(maxx,ans.v[0][i]);
printf("%lld",maxx);
return 0;
}

【BZOJ2973】石头游戏 矩阵乘法的更多相关文章

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

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

  2. AcWing 206. 石头游戏 矩阵乘法|矩阵快速幂

    AcWing 206. 石头游戏 石头游戏在一个 n 行 m 列 (1≤n,m≤8) 的网格上进行,每个格子对应一种操作序列,操作序列至多有10种,分别用0~9这10个数字指明. 操作序列是一个长度不 ...

  3. bzoj 3240: [Noi2013]矩阵游戏 矩阵乘法+十进制快速幂+常数优化

    3240: [Noi2013]矩阵游戏 Time Limit: 10 Sec  Memory Limit: 256 MBSubmit: 613  Solved: 256[Submit][Status] ...

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

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

  5. BZOJ2973 : 石头游戏

    考虑到$lcm(1,2,3,4,5,6)=60$,所以操作序列每60秒一个循环. 将操作表示成转移矩阵的形式,预处理出前60秒的转移矩阵以及它们的乘积$B$. 那么t秒的转移矩阵为前$t\bmod 6 ...

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

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

  7. 【bzoj3240 && 洛谷P1397】矩阵游戏[NOI2013](矩阵乘法+卡常)

    题目传送门:http://www.lydsy.com/JudgeOnline/problem.php?id=3240 这道题其实有普通快速幂+费马小定理的解法……然而我太弱了,一开始只想到了矩阵乘法的 ...

  8. 【bzoj1444】[Jsoi2009]有趣的游戏 AC自动机+矩阵乘法

    题目描述 输入 注意 是0<=P 输出 样例输入 样例输出 题解 AC自动机+矩阵乘法 先将所有字符串放到AC自动机中,求出Trie图. 然后构建邻接矩阵:如果x不是某个字符串的末位置,则x连向 ...

  9. BZOJ 1444 [JSOI2009]有趣的游戏 (AC自动机、概率与期望DP、矩阵乘法)

    诶这题洛谷居然没有??? 题目链接: https://www.lydsy.com/JudgeOnline/problem.php?id=1444 题解: 我见到主要有三种做法. 一是矩阵乘法.设\(d ...

随机推荐

  1. JSON对象和JSON字符串以及JSON.parse 函数的使用

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  2. store.js 跨浏览器的localStorage

    store.js 跨浏览器的localStorage 我们总是想要储存一些数据在浏览器端,却对复杂的兼容性头疼,store.js很好的解决了这些问题. store.js ☍ 使用它相当简单: // 储 ...

  3. Step by Step Learn Python(1)

    print "Hello World!" action = raw_input("please select your action{1, 2, 3, 4, 5, 6, ...

  4. Node.js开发入门—使用cookie保持登录

    这次来做一个站点登录的小样例,后面会用到. 这个演示样例会用到Cookie.HTML表单.POST数据体(body)解析. 第一个版本号,我们的用户数据就写死在js文件中. 第二个版本号会引入Mong ...

  5. Atitit.js javascript异常处理机制与java异常的转换 多重catc hDWR 环境 .js exception process Vob7

    Atitit.js javascript异常处理机制与java异常的转换 多重catc hDWR 环境 .js exception processVob7 1. 1. javascript异常处理机制 ...

  6. DB2检测表字段改动的方法(不用触发器)

    ALTER TABLE TEST ADD COLUMN RTS TIMESTAMP NOT NULL GENERATED ALWAYS FOR EACH ROW ON UPDATE AS ROW CH ...

  7. Android实战简易教程-第二十三枪(基于Baas的用户注冊验证username是否反复功能!)

    接上一篇,加入验证用户名是否已经注冊功能! 仅仅须要改动MainActivity.java: package com.example.logintest; import java.util.List; ...

  8. struts2内置拦截器和自定义拦截器详解(附源码)

    一.Struts2内置拦截器 Struts2中内置类许多的拦截器,它们提供了许多Struts2的核心功能和可选的高级特 性.这些内置的拦截器在struts-default.xml中配置.只有配置了拦截 ...

  9. jquery 查找元素

    /************ 查找父元素 *************/ //closest()方法 $("#mytd1").bind("click",functi ...

  10. noj1475(递推题)统计多少个1

    http://acm.nbut.cn/Problem/view.xhtml?id=1475 题意:给出一个数,需要你统计在这个数范围内有多少个1........ 思路:从高位到低位计算,例如1312 ...