前言
许多人所谓的成熟,不过是被习俗磨去了棱角,变得世故而实际了。
这两天的线性代数属实是要给我创破防了。
拼尽全力战胜基础题目之后,难的题目偏的偏怪的怪,还有一堆不会的数学知识点,我还是摆烂了吧。
先稍做一下总结。
以及,我突然意识到总结的效率问题,或许我真的应该减少每道题目的题解长度(?
A
判断矩阵 \(A\times B=C\)。
使用随机赋权的经典套路,弄出一个矩阵 \(x\),显然满足 \(A\times B\times x=C\times x\)。
将矩阵 \(x\) 的大小设成 \(n\times 1\) 的,根据结合律先算 \(B\times x\) 再算 \(A\times (B\times x)\),时间复杂度 \(\mathcal{O}(n^2)\),是可以通过的。
B
只讲第一问,第二问类似。
首先,本质上就是要去找到最大基的方案数,对于向量 \(A_1,A_2,...A_m\),他们线性无关可以通过行列式来刻画,即将这些向量拼起来的矩阵的 \(\textbf{Det}\) 不为 \(0\)。(显然,如果线性有关,那么上三角中的斜线必然有一个 \(0\)。)
然后有一个行列式的恒等式:
\[\boxed{\textbf{Det}(A\times B)=\sum_{S\in \begin{pmatrix} [n]\\m \end{pmatrix}} \textbf{Det}(A_{[m], S})\times \textbf{Det}(B_{S,[m]})} \]其中,\(A\) 是 \(m\times n\) 的矩阵,\(B\) 是 \(n\times m\) 的矩阵,\([n],[m]\) 表示 \(1,2,...(n \ \text{or}\ m)\) 这里面的所有数,\(\begin{pmatrix} [n]\\m \end{pmatrix}\) 表示从 \(1,2,3,....,n\) 中选择 \(m\) 个数所构成的集合。
发现,本题本质上是要从 \(n\) 条向量中选择 \(m\) 条,跑行列式,如果非 \(0\) 就会产生一个贡献。
发现一个有趣的事实是,\(\forall x\in N^+,x^2\equiv 1 \pmod 3\)。
故方案数本质上就是向量所拼凑出来的 \(m\times n\) 的矩阵 \(A\),和其 \(n\times m\) 的置换 \(B\),答案就是 \(\mathbf{Det}(A\times B)\),证明采用刚才的恒等式以及模三的性质即可得到。
C
感觉很没意思的硬套 \(\text{LGV}\) 的板子题目。
可以发现,奇数个交点和偶数个交点本质上对应的就是行列式中逆序对数为奇数和偶数的情况。
(其实说实话,就算真的无法对应,那能怎么做呢,猜也只能这么猜啊。。)
然后发现是 \(\text{DAG}\),可以求出任意起点到任意终点的方案数,直接上 \(\text{LGV}\) 板子即可。
D
概率不用管他,直接求方案数然后除以 \(2^{n\times k}\)。
假设终点集合是 \((y_1,y_2,....,y_k)\)。由于要满足路径两两不相交,考虑直接上 \(\text{LGV}\) 引理,那么在当前终点集合确定的情况下,方案就是:
\[\boxed{\sum_{P} \ (-1)^{\sigma(P)}\times \prod _{i=1}^n \mathcal{B}(x_{P_i}\to y_{i})} \]其中,\(P\) 是任意一个长度为 \(n\) 的排列, \(\mathcal{B}(x_{P_i}\to y_{i})\) 表示从 \(x_i\) 走到 \(y_{P_i}\) 的方案数,其实就是 \(C_{n}^{y_{i}-x_{P_i}}\)。
考虑根据这个式子,将逆序对的系数带进去进行 \(dp\)。
定义 \(dp_{i,S}\) 表示,当前 \(y_k\in [0,i]\) 已经对应了了所有 \(j\in S\) 的 \(x_j\) 的带权方案数(也就是考虑了逆序对的影响)。转移如下:
- 如果新的 \(y_k\) 的位置不在 \(i\),那么 \(dp_{i,S}=dp_{i-1, S}\)。
- 如果新的 \(y_k\) 位置在 \(i\),那么找到它对应的 \(x_j\),此时:\(dp_{i,S}=dp_{i-1,S\setminus j}\times (-1)^t \times C_{n}^{i-x_j}\)。(其中 \(t\) 表示 \(x_j\) 在已经填过的数中,会新产生的逆序对个数)
时间复杂度 \(\mathcal{O}(2^k\times (\max x + n))\)。
E
还不错的题。
首先有一个基于 \(\text{LGV}\) 引理的一个很重要的进阶用法。
假设起点集合是 \(S\),终点集合是 \(T\)。那么从 \(S\to T\),可以找到的,最多的不相交路径数量就是:
\[\boxed{ \textbf{Rank} \begin{pmatrix} \mathcal{P}(S_1\to T_1) & \mathcal{P}(S_1\to T_2) & \mathcal{P}(S_1\to T_3) & ... & \mathcal{P}(S_1\to T_m)\\ \mathcal{P}(S_2\to T_1) & \mathcal{P}(S_2\to T_2) & \mathcal{P}(S_2\to T_3) & ... & \mathcal{P}(S_2\to T_m)\\ \mathcal{P}(S_3\to T_1) & \mathcal{P}(S_3\to T_2) & \mathcal{P}(S_3\to T_3) & ... & \mathcal{P}(S_3\to T_m)\\ ... &...&...&...&...\\ \mathcal{P}(S_n\to T_1) & \mathcal{P}(S_n\to T_2) & \mathcal{P}(S_n\to T_3) & ... & \mathcal{P}(S_n\to T_m)\\ \end{pmatrix} } \]其中,\(\mathcal{P}(S_i\to T_j)\) 表示从 \(S_i\to T_j\) 的所有路径的权值之和。(一条路径的权值是其经过的边的权值的乘积,而一条边的权值可以通过随机赋权得到。)
可以发现,这个过程本质上就是一个求线性基大小的过程。
我们先假设 \(l\) 不会动的情况。相当于就是一直向右加 \(r\),每次加一个向量进去,然后求一遍当前矩阵的秩。
然后 \(l\) 会动的话,就考虑双指针,双指针对应的区间 \([l,r]\) 就是假设当前的 \(l\),然后找到最大的 \(r\) 使得当前矩阵的秩 \(\le k\)。然后考虑去维护所有的 \(k\) 的双指针即可。
不过双指针的话可能牵扯到带删除的线性基(即带上时间戳。)
时间复杂度 \(\mathcal{O}(n\times k^2)\)。
H
中间的题不会,所以跳了。
考虑枚举每一个 \(k\),那么能用的边就是一定的。
相当于问题就转化成了,在剩下有用的边中,有多少种形成二分图完美匹配的方案,然后你还需要一个高维差分来得到最终答案。
考虑怎么去看二分图完美匹配的方案,发现题目中本质上只让我们求了是否存在。(但是显然不能直接最大匹配,因为你需要高维差分)
我们把当前剩下的边对应的邻接矩阵看做一个行列式。
我们发现,在行列式的暴力计算中,我们需要枚举一个排列,而实际上,这个排列就是对应的一个二分图完美匹配,而后面的权值的乘积对应的就是如果非 \(0\) ,那么这个完美匹配存在,否则不存在。
所以我们对每一个 \(k\) 的邻接矩阵做一个行列式,然后高维差分,如果当前 \(k\) 对应的值非 \(0\) 那么就有完美匹配,否则没有。
后记
真的,好恶心啊,完全做不来,摆烂了。
标签:...,Day8,省选,text,矩阵,略解,times,行列式,mathcal From: https://www.cnblogs.com/SFsaltyfish/p/18650941