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 =[2pxy1]

一个一个乘即可。

[ARC138D] Differ by K bits

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

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

  • k ≡ 0 m o d    2 k \equiv 0 \mod 2 k0mod2 时,选择的数只能有偶数个 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=G2D

对于 F i ( i ≥ 3 ) F_i (i \ge 3) Fi(i3),可以先写成一般 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=1n(fi1(x,z)×Gz,y)fi2(x,y)×(deg(y)1)

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

考虑矩阵形式,记 E = D − I E=D-I E=DI,即度数数矩阵减去一个单位矩阵, 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=Fi1GFi2E

整理得:

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= GG2DFi=Fi1GFi2Ei=1i=2i3

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} [FiFi1]=[Fi1Fi2][GEI0]=...=[G2DG][GEI0]i2

关于时间复杂度,理论上 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(8n3logk)。由于我用的结构体套结构体,非常的慢,矩乘手动展开才过。代码

你可能感兴趣的:(游记,c++)