矩阵的相关性质再回顾

对于一个矩阵

  1. 满足结合律
  2. 满足乘法对于加法的分配率
  3. 但是不满足交换律!

对于特殊一点的矩阵来说:

把最左边还有最右面的看成一个数组。。

矩阵加速大法:

因为矩阵满足结合律,所以可以使用快速幂来进行计算。
规律总结:
矩阵加速设计到两个东西:

  • 状态矩阵
  • 转移矩阵
  1. 可以抽象出一个一维向量,在每一次递推就变化一次;
  2. 状态转移方程不发生变化;
  3. 状态转移过程中,一定是线性的(加减,乘以系数)
  4. 注意:状态矩阵需要尽可能短,转移次数可以比较大。

时间复杂度是

N

3

l

o

g

N

N^3logN

N3logN.

ACWing205. 斐波那契



要注意取模

代码

#include <bits/stdc++.h>
using namespace std;
const int len = 2;
const int mod = 10000;
void mulself(int a[2][2])
{
int c[2][2];
memset(c, 0, sizeof(c));
for(int i = 0; i < len; i++ )
for(int j = 0; j < len; j++)
for(int k = 0; k < len; k++)
c[i][j] = (c[i][j]+(long long)a[i][k] * a[k][j])%mod;
memcpy(a, c, sizeof(c));
}
void mul(int a[2][2], int f[2])
{
int c[2];
memset(c, 0, sizeof(c));
for(int j = 0; j < len; j++)
for(int k = 0; k < len; k++)
c[j] = (c[j] + (long long)f[k] * a[k][j])%mod;
memcpy(f, c, sizeof(c));
}
void solve(int n)
{
int a[2][2] = {{0, 1}, {1, 1}};
int f[2] = {0, 1};
for(; n; n >>= 1 )
{
if(n&1) mul(a, f);
mulself(a);
}
printf("%d\n", f[0]);
}
int main()
{
int n;
while((scanf("%d", &n)||1) && n != -1) solve(n);
return 0;
}

ACWing206. 石头游戏


解题思路:

感受:

太恶心了,一百多行代码,debug了一下午

代码


//在这个程序中所有的数组全部从1开始计数
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
ll n,m,t,act;
char op[20][20];//表示操作
ll oplen[20];
ll mp[70];//表示单元格映射的操作数字
ll matrix[70][70][70];
ll p;//p表示状态矩阵的从 0 到 p;
inline ll num(ll x, ll y)
{
if(x==0 && y==0) return 0;
return (x-1)*m + y;
}
void read_op_and_mp()
{
char buf[12];
for(int i = 1; i <= n; i++)
{
scanf("%s", buf+1);
for(int j = 1; j <= m; j++)
{
mp[num(i, j)] = buf[j]-'0'+1;
}
}
for(int i = 1; i <= act; i++)
{
scanf("%s", op[i]+1);
oplen[i] = strlen(op[i]+1);
}
}
void mulself(ll a[70][70])//
{
ll c[70][70];
memset(c, 0, sizeof(c));
for(int i = 0; i<= p; i++)
for(int j = 0; j <= p; j++)
for(int k = 0; k <= p; k++)
c[i][j] += a[i][k] * a[k][j];
memcpy(a, c, sizeof(c));
}
void mul(ll f[], ll a[70][70])
{
ll c[70];
memset(c, 0, sizeof(c));
for(int j = 0; j <= p; j++)
for(int k = 0; k <= p; k++)
{
c[j] += f[k] * a[k][j];
}
memcpy(f, c, sizeof(c));//sizeof不能是f因为f是指针。
}
void make_matrix()
{
ll tmp[70][70];
for(int i = 0; i <= p; i++) matrix[0][i][i] = 1;//设置为单位矩阵
for(int tt = 1; tt <= 60; tt++)
{
memset(tmp, 0, sizeof(tmp));
tmp[0][0] = 1;
for(int i = 1; i <= n; i++)
for(int j = 1; j <= m; j++)
{
char ch = op[mp[num(i, j)]][(tt-1)%oplen[mp[num(i, j)]]+1];
if('0' <= ch && ch <= '9')
{
tmp[num(0, 0)][num(i, j)] = ch-'0';
tmp[num(i, j)][num(i, j)] = 1;
}
else if(ch=='N')
{
if(i > 1) tmp[num(i, j)][num(i-1, j)] = 1;
}
else if(ch=='W')
{
if(j > 1) tmp[num(i, j)][num(i, j-1)] = 1;
}
else if(ch=='S')
{
if(i < n) tmp[num(i, j)][num(i+1, j)] = 1;
}
else if(ch=='E')
{
if(j < m) tmp[num(i, j)][num(i, j+1)] = 1;
}
}
for(int i = 0; i <= p; i++)
for(int j = 0; j <= p; j++)
for(int k = 0; k <= p; k++)
{
matrix[tt][i][j] += matrix[tt-1][i][k] * tmp[k][j];
}
}
}
ll solve()
{
ll ret = 0;
ll f[70] = {0};
f[0] = 1;
ll a[70][70];
make_matrix();
memcpy(a, matrix[60], sizeof(a));
ll xx = t / 60;
for(; xx; xx >>= 1)
{
if(xx&1) mul(f, a);
mulself(a);
}
mul(f, matrix[t%60]);
for(int i = 1; i <= p; i++) ret = max(ret, f[i]);
return ret;
}
int main()
{
cin >> n >> m >> t >> act;
read_op_and_mp();
p = m * n;
ll ans = solve();
cout << ans << endl;
return 0;
}

算法竞赛进阶指南0x34矩阵乘法的更多相关文章

  1. 算法竞赛进阶指南 0x00 基本算法

    放在原来这个地方不太方便,影响阅读体验.为了读者能更好的刷题,另起一篇随笔. 0x00 基本算法 0x01 位运算 [题目][64位整数乘法] 知识点:快速幂思想的灵活运用 [题目][最短Hamilt ...

  2. 算法竞赛进阶指南--快速幂,求a^b mod p

    // 快速幂,求a^b mod p int power(int a, int b, int p) { int ans = 1; for (; b; b >>= 1) { if (b &am ...

  3. 《算法竞赛进阶指南》0x10 基本数据结构 Hash

    Hash的基本知识 字符串hash算法将字符串看成p进制数字,再将结果mod q例如:abcabcdefg 将字母转换位数字(1231234567)=(1*p9+2*p8+3*p7+1*p6+2*p5 ...

  4. 《算法竞赛进阶指南》1.4Hash

    137. 雪花雪花雪花 有N片雪花,每片雪花由六个角组成,每个角都有长度. 第i片雪花六个角的长度从某个角开始顺时针依次记为ai,1,ai,2,-,ai,6. 因为雪花的形状是封闭的环形,所以从任何一 ...

  5. bzoj 1787 && bzoj 1832: [Ahoi2008]Meet 紧急集合(倍增LCA)算法竞赛进阶指南

    题目描述 原题连接 Y岛风景美丽宜人,气候温和,物产丰富. Y岛上有N个城市(编号\(1,2,-,N\)),有\(N-1\)条城市间的道路连接着它们. 每一条道路都连接某两个城市. 幸运的是,小可可通 ...

  6. POJ1639 算法竞赛进阶指南 野餐规划

    题目描述 原题链接 一群小丑演员,以其出色的柔术表演,可以无限量的钻进同一辆汽车中,而闻名世界. 现在他们想要去公园玩耍,但是他们的经费非常紧缺. 他们将乘车前往公园,为了减少花费,他们决定选择一种合 ...

  7. 算法竞赛进阶指南0x51 线性DP

    AcWing271. 杨老师的照相排列 思路 这是一个计数的题目,如果乱考虑,肯定会毫无头绪,所以我们从1号到最后一个依次进行安排. 经过反复实验,发现两个规律 每一行的同学必须是从左向右依次连续放置 ...

  8. 算法竞赛进阶指南0x35高斯消元与线性空间

    高斯消元 目录 高斯消元 ACWing207. 球形空间产生器(点击访问) 求解思路 代码 ACWing208. 开关问题(点击访问) 思路 代码 总结 欣赏 线性空间 定义 ACWing209. 装 ...

  9. 算法竞赛进阶指南0x14 Hash

    组成部分: 哈希函数: 链表 AcWing137. 雪花雪花雪花 因为所需要数据量过于大,所以只能以O(n)的复杂度. 所以不可能在实现的过程中一一顺时针逆时针进行比较,所以采用一种合适的数据结构. ...

随机推荐

  1. HMS Core分析服务助您掌握用户分层密码,实现整体收益提升

    随着市场愈发成熟,开发者从平衡收益和风险的角度开始逐步探索混合变现的优势,内购+广告就是目前市场上混合变现的主要方式之一. 对于混合变现模式,您是否有这样的困惑: 如何判断哪些用户更愿意看广告.哪些用 ...

  2. 实践GoF的23种设计模式:建造者模式

    摘要:针对这种对象成员较多,创建对象逻辑较为繁琐的场景,非常适合使用建造者模式来进行优化. 本文分享自华为云社区<[Go实现]实践GoF的23种设计模式:建造者模式>,作者: 元闰子. 简 ...

  3. 浅尝Spring注解开发_Servlet3.0与SpringMVC

    浅尝Spring注解开发_Servlet 3.0 与 SpringMVC 浅尝Spring注解开发,基于Spring 4.3.12 Servlet3.0新增了注解支持.异步处理,可以省去web.xml ...

  4. 论文解读(NGCF)《LightGCN: Simplifying and Powering Graph Convolution Network for Recommendation》

    论文信息 论文标题:LightGCN: Simplifying and Powering Graph Convolution Network for Recommendation论文作者:Xiangn ...

  5. 如何生成一个java文档

    如何生成一个java文档 众所周知,一个程序给别人看可能可以看懂,几万行程序就不一定了.在更多的时候,我们并不需要让别人知道我们的程序是怎么写的,只需要告诉他们怎么用的.那么,api文档就发挥了它的作 ...

  6. Spring Boot配置全局异常捕获

    1 SpringBoot配置全局的异常捕获 项目的说明 配置thymeleaf作为视图模板 ExceptionController.java模拟测试用 MyAjaxExceptionHandler.j ...

  7. 145_Power BI Report Server自定义Form登录

    博客:www.jiaopengzi.com 焦棚子的文章目录 请点击下载附件 1.背景 很久没有更新Power BI Report Server了,发现自己机器还是2021年1月版本的,现在更新了20 ...

  8. 基于C++11的数据库连接池实现

    0.注意 该篇文章为了让大家尽快看到效果,代码放置比较靠前,看代码前务必看下第4部分的基础知识. 1.数据库连接池 1.1 是什么? 数据库连接池负责分配.管理和释放数据库连接,属于池化机制的一种,类 ...

  9. python常用标准库(时间模块 time和datetime)

    常用的标准库 time时间模块 import time time -- 获取本地时间戳 时间戳又被称之为是Unix时间戳,原本是在Unix系统中的计时工具. 它的含义是从1970年1月1日(UTC/G ...

  10. 第6章 字符串(上)——C风格字符串

    6.1 C-strings(C 风格字符串) C风格字符串: 字符数组是元素为字符型的数组,字符串是以空字符'\0' 作为数组最后一个元素的字符数组. 如果指定了数组的大小,而字符串的长度又小于数组大 ...