BZOJ2973 : 石头游戏
考虑到$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 : 石头游戏的更多相关文章
- bzoj2973石头游戏——矩阵乘法
题目:权限题! 写了一下,但提交不了,先放着吧. 代码如下: #include<iostream> #include<cstdio> #include<cstring&g ...
- 【BZOJ2973】石头游戏 矩阵乘法
[BZOJ2973]石头游戏 Description 石头游戏的规则是这样的. 石头游戏在一个n行m列的方格阵上进行.每个格子对应了一个编号在0~9之间的操作序列. 操作序列是一个长度不超过6且循环执 ...
- CH3401 石头游戏(矩阵快速幂加速递推)
题目链接:传送门 题目: 石头游戏 0x30「数学知识」例题 描述 石头游戏在一个 n 行 m 列 (≤n,m≤) 的网格上进行,每个格子对应一种操作序列,操作序列至多有10种,分别用0~9这10个数 ...
- 【BZOJ2000】[HNOI2000]取石头游戏(贪心,博弈论)
[BZOJ2000][HNOI2000]取石头游戏(贪心,博弈论) 题面 BZOJ 洛谷 题解 这题好神仙啊,窝不会QaQ. 假装一下只有三个元素\(a_{i-1},a_i,a_{i+1}\),并且满 ...
- CH 3401 - 石头游戏 - [矩阵快速幂加速递推]
题目链接:传送门 描述石头游戏在一个 $n$ 行 $m$ 列 ($1 \le n,m \le 8$) 的网格上进行,每个格子对应一种操作序列,操作序列至多有 $10$ 种,分别用 $0 \sim 9$ ...
- CH3401 石头游戏
题意 3401 石头游戏 0x30「数学知识」例题 描述 石头游戏在一个 n 行 m 列 (1≤n,m≤8) 的网格上进行,每个格子对应一种操作序列,操作序列至多有10种,分别用0~9这10个数字指明 ...
- [luogu] P3210 [HNOI2010]取石头游戏(贪心)
P3210 [HNOI2010]取石头游戏 题目描述 A 公司正在举办一个智力双人游戏比赛----取石子游戏,游戏的获胜者将会获得 A 公司提供的丰厚奖金,因此吸引了来自全国各地的许多聪明的选手前来参 ...
- 7月18日刷题记录 二分答案跳石头游戏Getting
通过数:1 明天就要暑假编程集训啦~莫名开心 今天做出了一道 二分答案题(好艰辛鸭) 1049: B13-二分-跳石头游戏(二分答案) 时间限制: 5 Sec 内存限制: 256 MB提交: 30 ...
- 牛客1024B 石头游戏
题目描述 石头游戏在一个 \(n\) 行 \(m\) 列 \((1\leq n,m \leq 8)(1≤n,m≤8)\) 的网格上进行,每个格子对应一种操作序列,操作序列至多有10种,分别用0~9这1 ...
随机推荐
- 2-SAT问题的方案输出
2-sat 推荐学习资料: 伍昱的2003年IOI国家集训队论文<由对称性解2-sat问题> 论文链接:https://wenku.baidu.com/view/31fd7200bed5b ...
- bzoj千题计划218:bzoj2333: [SCOI2011]棘手的操作
http://www.lydsy.com/JudgeOnline/problem.php?id=2333 上次那个是线段树,再发一个左偏树 维护两种左偏树 第一种是对每个联通块维护一个左偏树 第二种是 ...
- 《高性能MySQL》——第五章创建高性能索引
1.创建索引基本语法格 在MySQL中,在已经存在的表上,可以通过ALTER TABLE语句直接为表上的一个或几个字段创建索引.基本语法格式如下: ALTER TABLE 表名 ADD [UNIQUE ...
- 『Matplotlib』数据可视化专项
一.相关知识 官网介绍 matplotlib API 相关博客 matplotlib绘图基础 漂亮插图demo 使用seaborn绘制漂亮的热度图 fig, ax = plt.subplots(2,2 ...
- git merge branch to master
git checkout master git pull git merge testbranch git push
- linux内存管理-内核用户空间 【转】
转自:http://blog.chinaunix.net/uid-25909619-id-4491362.html 1,linux内存管理中几个重要的结构体和数组 page unsigned long ...
- linux 串口驱动(二)初始化 【转】
转自:http://blog.chinaunix.net/uid-27717694-id-3493611.html 8250串口的初始化: (1)定义uart_driver.uart_ops.uart ...
- elasticsearch常见异常及解决办法
报错信息:Java HotSpot(TM) 64-Bit Server VM warning: INFO: os::commit_memory(0x0000000085330000, 20602552 ...
- centos6.5安装maridb5.5.51
1.先创建关于mariadb的yum源 vi /etc/yum.repos.d/MariaDB.repo [mariadb] name = MariaDB baseurl = http://yum.m ...
- 转:Vue-cli proxyTable 解决开发环境的跨域问题
转:http://www.jianshu.com/p/95b2caf7e0da 和后端联调时总是会面对恼人的跨域问题,最近基于Vue开发项目时也遇到了这个问题,两边各自想了一堆办法,查了一堆资料,加了 ...