矩阵

前言

这个东西想必各位大佬都会,在这里就是简单的梳理一下

写这个的原因是上次模拟赛,云落和 fjj 讲的矩阵本蒟蒻一点也没听懂

基础运算

加减法

要求两个矩阵的行、列数相同

把两个矩阵的对应元素加减即可

矩阵乘法

  1. 一个数乘,就直接用这个数 × 矩阵的每个元素

  2. 两个矩阵相乘

先放个式子 C[i,j]=k=1nA[i][k]×B[k][j]

能看出来乘法要求 A 的列数等于 B 的行数,且若 A 的尺寸为 m×n , B 的尺寸为 n×uC 的尺寸为 m×u

性质

有结合律,分配律,但没有交换律

矩阵快速幂加速递推

这是一类套路题

求一个线性递推数列的值,但 n 巨大,这是要用矩阵快速幂加速递推

以斐波那契数列为例

递推式:fn=fn1+fn2

我们可以借助一个矩阵 A 把递推关系转化为矩阵幂

[Fn Fn1]=[Fn1 Fn2]A=[F1 F0]An1

A 是一个 2×2 的矩阵,设

A=[abcd]

我们用一种特别规矩麻烦的方法解 a,b,c,d

展开 [Fn Fn1]=[Fn1 Fn2]A

Fn=aFn1+cFn2Fn1=bFn1+dFn2

Fn=Fn1+Fn2 代入

Fn1+Fn2=aFn1+cFn2

Fn1=bFn1+dFn2

把初始条件(F0=0,F1=1,F2=1) 代入:

n=2 时, F1+F0=aF1+cF0 F1=bF1+dF0

n=3 时, F2+F1=aF2+cF1 F2=bF2+dF1

得 a=b=c=1,d=0

A=[1110]

好的,那么我们已经会矩阵快速幂了

那么我们再看道题

给出一个 n×n 的矩阵和一个正整数 k,求 S=A+A2+A3++Ak。矩阵中的每个数对 m 取模。

ybt 上的题,让我们来推一遍

Fk=A+A2+A3++Ak

所以

Fk=Fk1+Ak

F0=O F1=A

则递推为

[Fk I]=[Fk1 I]S=……=[F0 I]Sk

用跟上面一样的步骤解

展开 [Fk I]=[Fk1 I]S

Fk=Fk1a+c,I=Fk1b+d

Fk=Fk1+Ak 代入

Fk1+Ak=Fk1a+c,I=Fk1b+d

代入 F0=O F1=A

k=1 时,F0+A=F0a+c,I=F0b+d

k=2 时,F1+A2=F1a+c,I=F1b+d

a=A,b=O,c=A,d=I

S=[AOAI]

好的,想必大家已经彻底会了

看道题

Sam数

k 位的相邻两数之差的绝对值不超过 2 的数的个数

n1018

dp 式子很好写

dpi,j 表示第 i 位为 j 时的方案总数

dpi,j=x=j2j+2dpi1,x

根据递推式,我们可以推出矩阵

1 1 1 0 0 0 0 0 0 0            f[i,0]         f[i,0]+f[i,1]+f[i,2]                         f[i+1,0]  
1 1 1 1 0 0 0 0 0 0            f[i,1]         f[i,0]+f[i,1]+f[i,2]+f[i,3]                  f[i+1,1]  
1 1 1 1 1 0 0 0 0 0            f[i,2]         f[i,0]+f[i,1]+f[i,2]+f[i,3]+f[i,4]           f[i+1,2]  
0 1 1 1 1 1 0 0 0 0            f[i,3]         f[i,1]+f[i,2]+f[i,3]+f[i,4]+f[i,5]           f[i+1,3]  
0 0 1 1 1 1 1 0 0 0      x     f[i,4]    =    f[i,2]+f[i,3]+f[i,4]+f[i,5]+f[i,6]     =     f[i+1,4]  
0 0 0 1 1 1 1 1 0 0            f[i,5]         f[i,3]+f[i,4]+f[i,5]+f[i,6]+f[i,7]           f[i+1,5]  
0 0 0 0 1 1 1 1 1 0            f[i,6]         f[i,4]+f[i,5]+f[i,6]+f[i,7]+f[i,8]           f[i+1,6]  
0 0 0 0 0 1 1 1 1 1            f[i,7]         f[i,5]+f[i,6]+f[i,7]+f[i,8]+f[i,9]           f[i+1,7]  
0 0 0 0 0 0 1 1 1 1            f[i,8]         f[i,6]+f[i,7]+f[i,8]+f[i,9]                  f[i+1,8]  
0 0 0 0 0 0 0 1 1 1            f[i,9]         f[i,7]+f[i,8]+f[i,9]                         f[i+1,9]

我们把矩阵 × k1 遍,再×f 就行了

矩阵乘法与路径问题

1.两点只经过 n 条边的总路径数量

结论:用邻接矩阵存图,计算矩阵的 n 次方,得到的值就是 ij 经过 n 条边的总路径数

证明:

很简单

n=1 时,值是走一条边的路径数(你建的)

n=2 时,M2=k=1NM(i,k)×M(k,j)

好像floyd啊

这个也好理解, k 是枚举中转点,只有当 M(i,k)=M(k,j)=1 时才有 M(i,k)×M(k,j)=1

n=3 M3=M2×M=k=1NM2(i,k)×M(k,j)

路径为 3 可以拆成路径为 2 和路径为 1 的,其他跟上面一样

好的,做道题

P4159

一个有向图有 n 个节点,节点从 1n 编号,windy 从节点 1 出发,他必须恰好在 t 时刻到达节点 n,每条边有一个长度,windy一时刻能走一单位长度

现在给出该有向图,你能告诉 windy 总共有多少种不同的路径吗?

答案对 2009 取模。

注意:windy 不能在某个节点逗留,且通过某有向边的时间严格为给定的时间。

2n101t109

这道题跟上面的模板就差边权了

但是这个很好处理,把边拆开就行了

P2151

2.两点只经过 n 条边的最短路径长度

这个跟上面的是一样的,只不过要用广义的矩阵乘法

M×M=min[M(i,k)+M(k,j)]

努力讲

云落和 fjj 切的题

dp 式子是很好推的

dpi=min(max(dpi1,ai),max(dpi2,ai1+ai))

写成矩阵

然后捏,看能不能用线段树维护

就是看他有没有结合律

不严谨的推法

乘法有结合律

max 显然有结合律

加法有交换律

min 显然有交换律

a×(b+c)=a×b+a×c

a+b 写成 +(a,b),把 a×b 写成 ×(a,b)

×(a,+(b,c))=+(×(a,b),×(a,c))

min 是加法,max 是乘法。

max(a,min(b,c))=min(max(a,b),max(a,c))

好了,他可以用线段树维护

那么我们枚举最小值,把 < 最小值的数在线段树上单修,最后用线段树维护矩阵乘法

后记

为什么今年没有圣诞老人……

posted @   小惰惰  阅读(14)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】
/* 鼠标点击求赞文字特效 */
点击右上角即可分享
微信分享提示

目录导航