给定矩阵$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)超过非栈元素的右边界时,将栈内元素暴力化为后缀积。

 1 #include <iostream>
 2 #include <cstdio>
 3 #include <cstring>
 4
 5 #define LL long long
 6 #define N 1000010
 7
 8 using namespace std;
 9
10 int P;
11
12 int m,n;
13
14 struct MA
15 {
16         LL a[5][5];
17         void scan()
18         {
19                 for(int i=0,j;i<m;i++)
20                         for(j=0;j<m;j++) scanf("%lld",&a[i][j]);
21         }
22         void init()
23         {
24                 memset(a,0,sizeof(a));
25                 for(int i=0;i<m;i++) a[i][i]=1;
26         }
27         void print()
28         {
29                 for(int i=0;i<m;i++)
30                 {
31                         for(int j=0;j<m;j++) printf("%lld ",a[i][j]);
32                         printf("\n");
33                 }
34         }
35 }A0,B;
36
37 MA sta[N];
38 MA pre[N];
39 MA sumv,A;
40 int c[N],tot,r;
41
42 MA mul(MA x,MA y)
43 {
44         MA ans;
45         for(int i=0,j,k;i<m;i++)
46                 for(j=0;j<m;j++)
47                 {
48                         ans.a[i][j]=0;
49                         for(k=0;k<m;k++)
50                                 ans.a[i][j] += x.a[i][k]*y.a[k][j];
51                 }
52         for(int i=0,j;i<m;i++)
53                         for(j=0;j<m;j++) ans.a[i][j]%=P;
54         return ans;
55 }
56
57 void build()
58 {
59         int tmp=r;
60         for(int i=1;i<=tot;i++) pre[++r]=sta[i];
61         tot=0;
62         for(int i=r-1;i>=tmp+1;i--) pre[i]=mul(pre[i], pre[i+1]);
63         sumv.init();
64 }
65
66 int main()
67 {
68         while(~scanf("%d%d%d",&n,&m,&P))
69         {
70                 A0.scan();
71                 B.scan();
72                 for(int i=1;i<=n;i++) scanf("%d",&c[i]);
73                 for(int i=0;i<=n;i++) pre[i].init();
74                 r=0;
75                 tot=0;
76                 pre[0]=A0;
77                 sumv.init();
78                 for(int i=1;i<=n;i++)
79                 {
80                         if(c[i]>r) build();
81                         A=mul(pre[c[i]],sumv);
82                         A=mul(A,B);
83                         sta[++tot]=A;
84                         sumv=mul(sumv,A);
85                 }
86                 A.print();
87         }
88         return 0;
89 }

View Code

当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)$

转载于:https://www.cnblogs.com/lawyer/p/6443625.html

Matrix Recurrence相关推荐

  1. C++实现线性递归矩阵 linear recurrence matrix算法(附完整源码)

    C++实现线性递归矩阵 linear recurrence matrix算法 C++实现线性递归矩阵 linear recurrence matrix算法完整源码(定义,实现,main函数测试) C+ ...

  2. CF1182E Product Oriented Recurrence

    CF1182E Product Oriented Recurrence 有一个递推式 \(f_x=c^{2x-6}\cdot f_{x-1}\cdot f_{x-2}\cdot f_{x-3}\;\; ...

  3. 【Rosalind】Rabbits and Recurrence Relations

    题目描述 Problem A sequence is an ordered collection of objects (usually numbers), which are allowed to ...

  4. Codeforces 1182E Product Oriented Recurrence 矩阵快速幂

    Product Oriented Recurrence 先化简原式子 c ^ x * f[x]  = c ^ (x-1) * f[x-1] * c ^ (x-2) * f[x-2] * c ^ (x- ...

  5. Lung Cancer Recurrence Risk Prediction through Integrated Deep Learning Evaluation【AI 肺癌复发预测】详解

    [利用深度学习评估预测肺癌复发风险:Lung Cancer Recurrence Risk Prediction through Integrated Deep Learning Evaluation ...

  6. Android 自定义View ——Matrix (矩阵)

    Matrix的作用: Matrix类包含一个3x3矩阵,用于转换坐标 Matrix (矩阵) 的原理很遗憾自己目前也是含糊的很,这里就不说了,记录自己在项目使用的方法, 这里就简单的记录下Matrix ...

  7. Codeforces 903F Clear The Matrix(状态压缩DP)

    题目链接 Clear The Matrix 题意 给定一个$4 * n$的矩形,里面的元素为$'.'$或$'*'$.现在有$4$种正方形可以覆盖掉$'*'$,正方形的边长分别为$1,2,3,4$. 求 ...

  8. ie旋转滤镜Matrix

    旋转一个元素算是一个比较常见的需求了吧,在支持CSS3的浏览器中可以使用transform很容易地实现,这里有介绍:http://www.css88.com/archives/2168,这里有演示ht ...

  9. Eigen(1):Matrix模板类

    Matrix是一个模板类,利用模板类可以定义矩阵类. 矩阵类模板: 1Matrix类有6个模板参数,只需要了解前3个就好了. Matrix<typename Scalar, int RowsAt ...

最新文章

  1. Pandas 中的 concat 函数
  2. python中构造方法可以被继承吗_构造函数是在python中继承的吗
  3. git工具tig用法
  4. 快速谱峭度matlab,一种基于快速谱峭度分析的泵潜在空化故障检测方法与流程
  5. 【Python】list转str
  6. 【Spark】一条 SQL 在 Apache Spark 之旅(上)
  7. java性能优化文章
  8. 给初学者的 RxJava2.0 教程 (九)
  9. LCD1602字符串显示(STM32F103)
  10. 20种最常见的网络安全攻击类型
  11. python如何循环sql语句_sql语句的for循环语句怎么写
  12. pycharm远程控制服务器(局域网 内网穿透)
  13. 凸优化读书笔记01(仿射集合、仿射组合,仿射包)
  14. 人脸识别活体检测技术探讨:多物理特征融合加分类器的算法技术
  15. wordpress企业网站主题
  16. 制作自己的openwrt刷机包_openwrt刷机教程
  17. 【仅剩12小时】Python科研绘图教程,40+绘图案例(附完整代码)
  18. 线上插画培训班有用吗,教你选靠谱的插画课程
  19. 《过目不忘的读书方法》读书摘要
  20. 手机唯一标识IMEI以及与IMSI的区别

热门文章

  1. 【前端使用插件js-export-excel导出excel】
  2. 笔记:机器学习的工作流程
  3. CRecordset::GetRecordCount()
  4. 60FPS你有吗?现代电影级游戏效果全解析
  5. PP-LCNet-A Lightweight CPU Convolutional Neural Network
  6. 彩虹易支付推广模式查单投诉文件发布
  7. k8s的Pods里面ImagePullBackOff的网络问题
  8. 基础乐理 节奏联系题,很重要
  9. 基于MATLAB软件GUI界面的可编程电音合成器软件
  10. 计算机raid基础知识,主板知识详解:板载 RAID