矩阵!矩阵!矩阵!
[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)。由于我用的结构体套结构体,非常的慢,矩乘手动展开才过。代码