给定矩阵$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)$

最新文章

  1. php常用string函数
  2. 如果简单的记录,就可以为这个世界创造更多的财富,那么还有什么理由不去写博客呢? — 读&lt;&lt;黑客与画家&gt;&gt; 有感
  3. 后勤数据抽取流程图 Logistic Data Extraction
  4. [C# 基础知识系列]C#中易混淆的知识点
  5. Amarino例程无法使用的问题
  6. IOS release 版本的时候 去掉输出log NSLog
  7. 笔记-Nodejs中的核心API之Events
  8. Codeforces Round #296 (Div. 2) A. Playing with Paper
  9. 关于stringWithFormat: - 两段NSString如何合成一段
  10. [Tjoi2013]循环格
  11. a链接在新窗口打开
  12. 给web请求加遮罩动画
  13. ORA-12541:TNS:无监听程序
  14. html5 表單輸入類型
  15. laravel 错误 1071 Specified key was too long; max key length is 1000 bytes
  16. 检测QQ在线状态脚本(20141022测试成功)
  17. SQL 中 replace 替换字符串中的字符 &#39;&#39;
  18. windows 静态IP设置举例
  19. C++友元函数、友元类
  20. python获取toast 验证

热门文章

  1. 数据结构与算法——AVL树类的C++实现
  2. python(15)- 装饰器及装饰器的使用
  3. VueJS处理逻辑指令:v-if
  4. MFC小程序02————— 不规则窗体小应用程序
  5. vim 模式切换
  6. 排序&amp;匿名函数
  7. android IPC通信(上)-sharedUserId&amp;amp;&amp;amp;Messenger
  8. ffmpeg编码常见问题排查方法
  9. 设置VIM查找时不区分大小写
  10. Spring 4.2框架中注释驱动的事件监听器详解