【BZOJ2973】石头游戏 矩阵乘法
【BZOJ2973】石头游戏
Description
Input
Output
Sample Input
011112
1E
E
0
Sample Output
【样例解释】
这是另一个类似于传送带的结构。左边的设备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】石头游戏 矩阵乘法的更多相关文章
- bzoj2973石头游戏——矩阵乘法
题目:权限题! 写了一下,但提交不了,先放着吧. 代码如下: #include<iostream> #include<cstdio> #include<cstring&g ...
- AcWing 206. 石头游戏 矩阵乘法|矩阵快速幂
AcWing 206. 石头游戏 石头游戏在一个 n 行 m 列 (1≤n,m≤8) 的网格上进行,每个格子对应一种操作序列,操作序列至多有10种,分别用0~9这10个数字指明. 操作序列是一个长度不 ...
- bzoj 3240: [Noi2013]矩阵游戏 矩阵乘法+十进制快速幂+常数优化
3240: [Noi2013]矩阵游戏 Time Limit: 10 Sec Memory Limit: 256 MBSubmit: 613 Solved: 256[Submit][Status] ...
- CH 3401 - 石头游戏 - [矩阵快速幂加速递推]
题目链接:传送门 描述石头游戏在一个 $n$ 行 $m$ 列 ($1 \le n,m \le 8$) 的网格上进行,每个格子对应一种操作序列,操作序列至多有 $10$ 种,分别用 $0 \sim 9$ ...
- BZOJ2973 : 石头游戏
考虑到$lcm(1,2,3,4,5,6)=60$,所以操作序列每60秒一个循环. 将操作表示成转移矩阵的形式,预处理出前60秒的转移矩阵以及它们的乘积$B$. 那么t秒的转移矩阵为前$t\bmod 6 ...
- CH3401 石头游戏(矩阵快速幂加速递推)
题目链接:传送门 题目: 石头游戏 0x30「数学知识」例题 描述 石头游戏在一个 n 行 m 列 (≤n,m≤) 的网格上进行,每个格子对应一种操作序列,操作序列至多有10种,分别用0~9这10个数 ...
- 【bzoj3240 && 洛谷P1397】矩阵游戏[NOI2013](矩阵乘法+卡常)
题目传送门:http://www.lydsy.com/JudgeOnline/problem.php?id=3240 这道题其实有普通快速幂+费马小定理的解法……然而我太弱了,一开始只想到了矩阵乘法的 ...
- 【bzoj1444】[Jsoi2009]有趣的游戏 AC自动机+矩阵乘法
题目描述 输入 注意 是0<=P 输出 样例输入 样例输出 题解 AC自动机+矩阵乘法 先将所有字符串放到AC自动机中,求出Trie图. 然后构建邻接矩阵:如果x不是某个字符串的末位置,则x连向 ...
- BZOJ 1444 [JSOI2009]有趣的游戏 (AC自动机、概率与期望DP、矩阵乘法)
诶这题洛谷居然没有??? 题目链接: https://www.lydsy.com/JudgeOnline/problem.php?id=1444 题解: 我见到主要有三种做法. 一是矩阵乘法.设\(d ...
随机推荐
- JSON对象和JSON字符串以及JSON.parse 函数的使用
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...
- store.js 跨浏览器的localStorage
store.js 跨浏览器的localStorage 我们总是想要储存一些数据在浏览器端,却对复杂的兼容性头疼,store.js很好的解决了这些问题. store.js ☍ 使用它相当简单: // 储 ...
- Step by Step Learn Python(1)
print "Hello World!" action = raw_input("please select your action{1, 2, 3, 4, 5, 6, ...
- Node.js开发入门—使用cookie保持登录
这次来做一个站点登录的小样例,后面会用到. 这个演示样例会用到Cookie.HTML表单.POST数据体(body)解析. 第一个版本号,我们的用户数据就写死在js文件中. 第二个版本号会引入Mong ...
- Atitit.js javascript异常处理机制与java异常的转换 多重catc hDWR 环境 .js exception process Vob7
Atitit.js javascript异常处理机制与java异常的转换 多重catc hDWR 环境 .js exception processVob7 1. 1. javascript异常处理机制 ...
- DB2检测表字段改动的方法(不用触发器)
ALTER TABLE TEST ADD COLUMN RTS TIMESTAMP NOT NULL GENERATED ALWAYS FOR EACH ROW ON UPDATE AS ROW CH ...
- Android实战简易教程-第二十三枪(基于Baas的用户注冊验证username是否反复功能!)
接上一篇,加入验证用户名是否已经注冊功能! 仅仅须要改动MainActivity.java: package com.example.logintest; import java.util.List; ...
- struts2内置拦截器和自定义拦截器详解(附源码)
一.Struts2内置拦截器 Struts2中内置类许多的拦截器,它们提供了许多Struts2的核心功能和可选的高级特 性.这些内置的拦截器在struts-default.xml中配置.只有配置了拦截 ...
- jquery 查找元素
/************ 查找父元素 *************/ //closest()方法 $("#mytd1").bind("click",functi ...
- noj1475(递推题)统计多少个1
http://acm.nbut.cn/Problem/view.xhtml?id=1475 题意:给出一个数,需要你统计在这个数范围内有多少个1........ 思路:从高位到低位计算,例如1312 ...