给定矩阵$A,B$,且有

$$
f(0) = A ,f(i) =B * \prod_{i=w(i)}^{i-1}f(i)
$$

求f(n)

其中,当w(i)单增时,可以做到$O(n*m^3)$,注意要优化取模运算。

对于加入的f(i),我们压入栈中,维护栈的 元素积。

同时维护栈之前的一段元素的后缀积,当w(i)超过非栈元素的右边界时,将栈内元素暴力化为后缀积。

 #include <iostream>
#include <cstdio>
#include <cstring> #define LL long long
#define N 1000010 using namespace std; int P; int m,n; struct MA
{
LL a[][];
void scan()
{
for(int i=,j;i<m;i++)
for(j=;j<m;j++) scanf("%lld",&a[i][j]);
}
void init()
{
memset(a,,sizeof(a));
for(int i=;i<m;i++) a[i][i]=;
}
void print()
{
for(int i=;i<m;i++)
{
for(int j=;j<m;j++) printf("%lld ",a[i][j]);
printf("\n");
}
}
}A0,B; MA sta[N];
MA pre[N];
MA sumv,A;
int c[N],tot,r; MA mul(MA x,MA y)
{
MA ans;
for(int i=,j,k;i<m;i++)
for(j=;j<m;j++)
{
ans.a[i][j]=;
for(k=;k<m;k++)
ans.a[i][j] += x.a[i][k]*y.a[k][j];
}
for(int i=,j;i<m;i++)
for(j=;j<m;j++) ans.a[i][j]%=P;
return ans;
} void build()
{
int tmp=r;
for(int i=;i<=tot;i++) pre[++r]=sta[i];
tot=;
for(int i=r-;i>=tmp+;i--) pre[i]=mul(pre[i], pre[i+]);
sumv.init();
} int main()
{
while(~scanf("%d%d%d",&n,&m,&P))
{
A0.scan();
B.scan();
for(int i=;i<=n;i++) scanf("%d",&c[i]);
for(int i=;i<=n;i++) pre[i].init();
r=;
tot=;
pre[]=A0;
sumv.init();
for(int i=;i<=n;i++)
{
if(c[i]>r) build();
A=mul(pre[c[i]],sumv);
A=mul(A,B);
sta[++tot]=A;
sumv=mul(sumv,A);
}
A.print();
}
return ;
}

当w(i)不单增时,我们可以维护$8$个长度为$6,6^2,6^3...6^8$的队列,每一次将新加入的元素先压入长度为$6$的队列,并$O(m^3*6)$维护后缀积,当队列满了之后,将其作为一个元素加入$6^2$的队列,同时维护至多$6$个元素的后缀积,当$6^2$满了之后$O(m^3*6^2)$ 暴力将其变为一个元素(算出$6^2$个元素的后缀积),并作为整体压入下一序列。

每个元素最多被更新了8次,所以 $O(8*n*m^3)$

Matrix Recurrence的更多相关文章

  1. Searching a 2D Sorted Matrix Part I

    Write an efficient algorithm that searches for a value in an n x m table (two-dimensional array). Th ...

  2. fzu 1911 C. Construct a Matrix

    C. Construct a Matrix Time Limit: 1000ms Case Time Limit: 1000ms Memory Limit: 32768KB Special Judge ...

  3. Construct a Matrix (矩阵快速幂+构造)

    There is a set of matrixes that are constructed subject to the following constraints: 1. The matrix ...

  4. angular2系列教程(十一)路由嵌套、路由生命周期、matrix URL notation

    今天我们要讲的是ng2的路由的第二部分,包括路由嵌套.路由生命周期等知识点. 例子 例子仍然是上节课的例子:

  5. Pramp mock interview (4th practice): Matrix Spiral Print

    March 16, 2016 Problem statement:Given a 2D array (matrix) named M, print all items of M in a spiral ...

  6. Atitit Data Matrix dm码的原理与特点

    Atitit Data Matrix dm码的原理与特点 Datamatrix原名Datacode,由美国国际资料公司(International Data Matrix, 简称ID Matrix)于 ...

  7. Android笔记——Matrix

    转自:http://www.cnblogs.com/qiengo/archive/2012/06/30/2570874.html#translate Matrix的数学原理 在Android中,如果你 ...

  8. 通过Matrix进行二维图形仿射变换

    Affine Transformation是一种二维坐标到二维坐标之间的线性变换,保持二维图形的"平直性"和"平行性".仿射变换可以通过一系列的原子变换的复合来 ...

  9. [LeetCode] Kth Smallest Element in a Sorted Matrix 有序矩阵中第K小的元素

    Given a n x n matrix where each of the rows and columns are sorted in ascending order, find the kth ...

随机推荐

  1. python(36)- 测试题

    1.8<<2等于? 32 “<<”位运算 264 132 64 32 16 8 4 2 1 原始位置 0 0 0 0 0 1 0 0 0 想左位移2位 0 0 0 1 0 0 ...

  2. vim 查找整个工程

    1. 使用vim内置搜索引擎 vimgrep 格式::vim /patern/gj ** 命令::vim 或者 :vimgrep 模式: 查询模式包含在 / / 之间 参数: g 表示将同一行搜到的关 ...

  3. systemd、upstart和system V

    http://blog.csdn.net/kumu_linux/article/details/7653802  systemd是Linux下的一种init软件,由Lennart Poettering ...

  4. git clean

    使用git clean清除未加入版控的数据 作者:Level Up  发布日期:2012-12-21 10:48:10       笔者在使用版本控制软件时,不知为何常常会有些暂存的数据产生.像是下面 ...

  5. Django-models-m2m

    在Django的orm中,如果有多对多的字段,那么他的第三张表时自己生成的,参考官方文档发现第三张表可以自己写↓: 而且第三张表好像是可以自定制的 from django.db import mode ...

  6. dsp-asic-fpga

    DSP是在模拟信号变换成数字信号以后进行高速实时处理的专用处理器,它采用的是哈佛设计,即数据总线和地址总线分开,使程序和数据分别存储在两个分开的空间,允许取指令和执行指令完全重叠,也就是说在执行上一条 ...

  7. caffe搭建----Visual Studio 2015+CUDA8.0+CUDNN5配置Caffe-windows(BLVC)

    原文来源:  来源:Angle_Cal  2016-12-19 17:32 本博主修改于2017-09-12.  版权所有,转载请注明出处.   BLVC版本的Caffe-windows已经支持Vis ...

  8. CSS入门学习

    一.What? CSS的全称是CascadingStyle Sheet,汉语意思是"级联样式表".通常又称为"风格样式表(StyleSheet)".它是用来进行 ...

  9. svn服务器迁移(windows下)

    废话不多说,直接上步骤: 服务端: 1.创建一个备份文件夹 如:D:\svn_bak 2.进入cmd,cd命令到你的svn服务器安装目录的bin文件下,本人的安装目录在 D:\Program File ...

  10. Spring Data MongoDB 四:基本文档改动(update)(一)

    Spring Data MongoDB 三:基本文档查询(Query.BasicQuery)(一) 学习MongoDB 二:MongoDB加入.删除.改动 一.简单介绍 Spring Data  Mo ...