Matrix Recurrence
给定矩阵$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的更多相关文章
- 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 ...
- fzu 1911 C. Construct a Matrix
C. Construct a Matrix Time Limit: 1000ms Case Time Limit: 1000ms Memory Limit: 32768KB Special Judge ...
- Construct a Matrix (矩阵快速幂+构造)
There is a set of matrixes that are constructed subject to the following constraints: 1. The matrix ...
- angular2系列教程(十一)路由嵌套、路由生命周期、matrix URL notation
今天我们要讲的是ng2的路由的第二部分,包括路由嵌套.路由生命周期等知识点. 例子 例子仍然是上节课的例子:
- 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 ...
- Atitit Data Matrix dm码的原理与特点
Atitit Data Matrix dm码的原理与特点 Datamatrix原名Datacode,由美国国际资料公司(International Data Matrix, 简称ID Matrix)于 ...
- Android笔记——Matrix
转自:http://www.cnblogs.com/qiengo/archive/2012/06/30/2570874.html#translate Matrix的数学原理 在Android中,如果你 ...
- 通过Matrix进行二维图形仿射变换
Affine Transformation是一种二维坐标到二维坐标之间的线性变换,保持二维图形的"平直性"和"平行性".仿射变换可以通过一系列的原子变换的复合来 ...
- [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 ...
随机推荐
- Node.js知识点学习
Node.js知识点学习 一.基本概念 Node.js,或者 Node,是一个可以让 JavaScript 运行在服务器端的平台.可以说,Node.js开创了javascript模块化开发的先河,早期 ...
- 转 Python Selenium设计模式-POM
前言 本文就python selenium自动化测试实践中所需要的POM设计模式进行分享,以便大家在实践中对POM的特点.应用场景和核心思想有一定的理解和掌握. 为什么要用POM 基于python s ...
- 用DD-WRT自建计费WiFi热点
架设无线网络(Wlan)向周围的用户有偿共享网络. 传统的方法,能够使用专业的无线与宽带计费网关设备和软件.比方MikroTik等. 只是,对于个人架设WiFi热点来说.这些方案太过昂贵,安装设置也很 ...
- ARM architecture
http://en.wikipedia.org/wiki/ARM_architecture ARM architecture ARM architectures The ARM logo De ...
- linux之return和exit引发的大问题(vfork和fork)
在coolshell.cn上看到的一个问题.为此拿来研究一下. 首先 看看return和exit的差别 在linux上分别跑一下这个代码 int main() { return 0; //exit(0 ...
- 九度OJ 1127:简单密码 (翻译)
时间限制:1 秒 内存限制:32 兆 特殊判题:否 提交:1218 解决:721 题目描述: Julius Caesar曾经使用过一种很简单的密码. 对于明文中的每个字符,将它用它字母表中后5位对应的 ...
- Xcode6 新特性
苹果在WWDC 2014上对新版Xcode(Xcode 6 Beta版)并没有提及过多.但它却是开发人员不能忽视的一部分.Xcode 6 Beta版为设计和创建软件引入了新方法,更加关注功能和一些改善 ...
- 关于4Ps 、4Cs 、4Rs 、4Vs营销策略的内容及优劣比较
- iOS 工程中 Other Linker Flags
对于64位机子和iPhone OS应用 解决方法是使用-all_load 或者 -force_load. -all_load强迫链接器从它能看见的所有文档中加载所有的对象文件,甚至那些没有OC代码的文 ...
- codeforces776E
传送门 这题看着很唬人,但实际上是道水题... f[n]通过打表或证明,可以发现就是欧拉函数,g[n]恒等于n,所以题目的意思就是让你求n的k次欧拉函数. 可以发现实际上k次欧拉函数,n的数值减小得很 ...