Day8 线性代数

矩阵!矩阵!矩阵!

[ABC189E] Rotate and Flip

SOL1:

设每个点坐标 ( a x + b y + c , d x + e y + f ) (ax+by+c,dx+ey+f) (ax+by+c,dx+ey+f),每次转移系数即可。代码

SOL2:

考虑矩阵形式,每次改变对应一个转移矩阵,例如关于 x = p x=p x=p 对称: [ x y 1 ] [ − 1 0 0 0 1 0 2 p 0 1 ] = [ 2 p − x y 1 ] \begin{bmatrix} x & y & 1 \end{bmatrix}\begin{bmatrix} -1 & 0 & 0\\ 0 & 1 & 0\\ 2p & 0 & 1\end{bmatrix}=\begin{bmatrix} 2p-x & y & 1 \end{bmatrix} [xy1] −102p010001 =[2p−xy1]

一个一个乘即可。

[ARC138D] Differ by K bits

无解时暴搜复杂度较高,有解时爆搜情况比较少。由于关系成环,不妨设 a 1 = 0 a_1 = 0 a1=0。

  • k ≥ n k \ge n k≥n 时,显然无解。

  • 当 k ≡ 0 m o d    2 k \equiv 0 \mod 2 k≡0mod2 时,选择的数只能有偶数个 1 1 1,无法构造序列。

特判之后就是暴搜。

代码

CF1662C European Trip

先考虑没有不能重复走相临边的限制,是个矩阵问题。记邻接矩阵为 G G G , G i , i k G^k_{i,i} Gi,ik 就是 i i i 出发的方案,答案就是 ∑ G i , i k \sum G^k_{i,i} ∑Gi,ik。

参考上述情况,我们记答案矩阵为 F k F_k Fk 表示 k k k 走步的合法方案数。

有:
F 1 = G F_1=G F1=G

对于 F 2 F_2 F2,应当为 G 2 G^2 G2 减去重复走的方案数。只走两步,重复走的一定是自己到自己。对于一个点 i i i,有 deg ⁡ ( i ) \deg(i) deg(i) 种重复方案。记 D D D 为度数矩阵,其中 D i , i = deg ⁡ ( i ) D_{i,i} = \deg (i) Di,i=deg(i),有:

F 2 = G 2 − D F_2 = G^2 - D F2=G2−D

对于 F i ( i ≥ 3 ) F_i (i \ge 3) Fi(i≥3),可以先写成一般 dp 形式,记 f i ( x , y ) f_i(x,y) fi(x,y) 表示 i i i 步 从 x x x 到 y y y 的合法方案。有:

f i ( x , y ) = ∑ z = 1 n ( f i − 1 ( x , z ) × G z , y ) − f i − 2 ( x , y ) × ( deg ⁡ ( y ) − 1 ) f_{i}(x,y) =\sum_{z=1}^n (f_{i-1}(x,z)\times G_{z,y}) - f_{i-2}(x,y) \times (\deg (y) - 1) fi(x,y)=z=1∑n(fi−1(x,z)×Gz,y)−fi−2(x,y)×(deg(y)−1)

用前 i − 1 i-1 i−1 步合法的方案数,减去第 i i i 步与 i − 1 i-1 i−1 步相同的方案数,即这两步从 y y y 到 y y y,去除 i − 2 i-2 i−2 步走到 y y y 的那条边,这两步有 ( deg ⁡ ( y ) − 1 ) (\deg (y) - 1) (deg(y)−1) 种走法。

考虑矩阵形式,记 E = D − I E=D-I E=D−I,即度数数矩阵减去一个单位矩阵, E i , i = deg ⁡ ( i ) − 1 E_{i,i} = \deg (i) - 1 Ei,i=deg(i)−1,有:

F i = F i − 1 G − F i − 2 E F_i =F_{i-1}G -F_{i-2}E Fi=Fi−1G−Fi−2E

整理得:

F i = { G i = 1 G 2 − D i = 2 F i = F i − 1 G − F i − 2 E i ≥ 3 F_i = \begin {cases} G & i = 1\\ G^2-D & i=2\\ F_i =F_{i-1}G -F_{i-2}E & i \ge 3 \end{cases} Fi=⎩ ⎨ ⎧GG2−DFi=Fi−1G−Fi−2Ei=1i=2i≥3

F F F 构成了广义斐波那契数列的形式,可以用矩阵快速幂加速 F F F 的转移:

[ F i F i − 1 ] = [ F i − 1 F i − 2 ] [ G I − E 0 ] = . . . = [ G 2 − D G ] [ G I − E 0 ] i − 2 \begin{bmatrix} F_i & F_{i-1}\end{bmatrix} = \begin{bmatrix} F_{i-1} & F_{i-2}\end{bmatrix} \begin{bmatrix} G & I\\-E & 0\end{bmatrix}= ...=\begin{bmatrix} G^2-D & G\end{bmatrix}\begin{bmatrix} G & I\\-E & 0\end{bmatrix}^{i-2} [FiFi−1]=[Fi−1Fi−2][G−EI0]=...=[G2−DG][G−EI0]i−2。

关于时间复杂度,理论上 log ⁡ k \log k logk 次矩阵快速幂,每次 O ( 8 × n 3 ) O(8 \times n^3) O(8×n3),总 O ( 8 ⋅ n 3 log ⁡ k ) O(8\cdot n^3 \log k) O(8⋅n3logk)。由于我用的结构体套结构体,非常的慢,矩乘手动展开才过。代码

相关推荐
南东山人4 小时前
一文说清:C和C++混合编程
c语言·c++
Ysjt | 深7 小时前
C++多线程编程入门教程(优质版)
java·开发语言·jvm·c++
ephemerals__7 小时前
【c++丨STL】list模拟实现(附源码)
开发语言·c++·list
Microsoft Word7 小时前
c++基础语法
开发语言·c++·算法
一只小小汤圆7 小时前
opencascade源码学习之BRepOffsetAPI包 -BRepOffsetAPI_DraftAngle
c++·学习·opencascade
legend_jz8 小时前
【Linux】线程控制
linux·服务器·开发语言·c++·笔记·学习·学习方法
嘿BRE8 小时前
【C++】几个基本容器的模拟实现(string,vector,list,stack,queue,priority_queue)
c++
ö Constancy9 小时前
c++ 笔记
开发语言·c++
fengbizhe9 小时前
笔试-笔记2
c++·笔记