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