1.定长路径统计
给出一个n个点m条边的有向图,每次给出三个整数u,v,k,求有多少条从u到v的路径长度为k(不一定为简单路径)
我们用邻接矩阵G存储这个图,Gu,v表示从u到v的边数
令Fk为长度为k的路径条数构成的矩阵,显然有:
Fki,j=n∑k=1Fk−1i,k×Gk,j
我们将其看作是两个矩阵相乘:
Fk=Fk−1×G
那么显然有:
Fk=Gk
矩阵快速幂即可
2.定长路径统计*
给出一个n个点m条边的有向图,每次给出三个整数u,v,k,求有多少条从u到v的路径长度小于等于k(不一定为简单路径)
我们把每个点加一条连向自己的边权为1的边,跑矩阵快速幂即可
3.「LibreOJ 6208」树上询问
给出一棵有n个节点的树,根节点为1号节点每个节点有两个值k,t,初始均为0
每次进行如下3种操作之一:
1.Add(x,d):将x到根节点路径上每个点的ki←ki+d
2.Mul(x,d):将x到根节点路径上每个点的ti←ti+d×ki
3.Query(x):求tx
1≤n,m≤105,−10≤d≤10
直接树剖确实可以做,但是比较麻烦,我们用矩阵来刻画每个操作:
Add:
[tiki1]⎡⎢⎣1000100d1⎤⎥⎦=[tiki+d1]
Mul:
[tiki1]⎡⎢⎣100d10001⎤⎥⎦=[ti+d×kiki1]
然后树剖维护即可
4.[TJOI2019]甲苯先生的字符串
给出一个仅有小写字母字符串S1,求满足如下条件的字符串S2有多少种:
1.S2长度为n
2.S2仅由小写字母构成
3.S1中长度为2的任意连续子串在S2中不能出现
1≤n≤1015
我们将小写字母映射为数字,即a=1,b=2…z=26
令dpi,j为长度为i且当前字符为j的合法字符串数量,显然有:
dpi,j=26∑k=1dpi−1,k[kj∉S1]
我们预处理出后面那个东西,令它为w,那么就有:
dpi,j=26∑k=1dpi−1,k×wk,j
n很大,暴力dp会炸掉,发现上面的转移方程是矩阵乘法的形式,可以用矩阵优化:
原矩阵:
[dpi,1dpi,2⋯dpi,26]
base
矩阵:
⎡⎢
⎢
⎢
⎢
⎢⎣w1,1w1,2⋯w1,26w2,1w2,2⋯w2,26⋮⋮⋱⋮w26,1w26,2⋯w26,26⎤⎥
⎥
⎥
⎥
⎥⎦
5.[SHOI2013]超级跳马
现有一个 n 行 m 列的棋盘,一只马欲从棋盘的左上角跳到右下角。每一步它向右跳奇数列,且跳到本行或相邻行。跳跃期间,马不能离开棋盘。例如,当 n=3,m=10 时,下图是一种可行的跳法。

求总方案数。
1≤n≤50,2≤m≤109
设dpi,j为跳到(i,j)的方案数,显然当只往右跳1格时有:
dpi,j=dpi−1,j−1+dpi,j−1+dpi+1,j−1
考虑到如果能一次跳到(i,j),那么肯定也可以一次跳到(i,j−2),所以转移方程即为:
dpi,j=dpi−1,j−1+dpi,j−1+dpi+1,j−1+dpi,j−2
直接dp发现O(nm)的复杂度接受不了,考虑矩阵优化(以n=3为例):
原矩阵:
[dp1,jdp2,jdp3,jdp1,j−1dp2,j−1dp3,j−1]
base
矩阵:
⎡⎢
⎢
⎢
⎢
⎢
⎢
⎢
⎢⎣110100111010011001100000010000001000⎤⎥
⎥
⎥
⎥
⎥
⎥
⎥
⎥⎦
注意到n非常小,故以上做法可以通过
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步