LOJ #6040. 「雅礼集训 2017 Day5」矩阵

发布时间 2023-11-10 15:55:57作者: 275307894a

题面传送门

不会线性代数?!又被 ZJ 薄纱了!

首先我们考虑如果确定了 \(A\) 矩阵,怎么计算 \(B\) 矩阵的个数。

好像有点困难,不妨先考虑 \(C\) 全零的情况。考虑 \(B\) 的一列,将其设成未知数,则最后的答案就是形如 \(\sum A_{i,j}b_{j}=0\) 这样 \(n\) 个方程解的个数,这显然是 \(2^{n-|A|}\)。对于所有 \(n\) 列答案是一样的,所以是再 \(n\) 次即可。

然后考虑 \(C\) 不全为 \(0\) 的情况,发现这时候方程右边不全为 \(0\),这样的话可能有无解的情况。抛开无解的情况不看,方案数还是上面那个,所以我们需要对于每个秩,计算非无解的,秩为这个值的矩阵个数。

\(dp_{i,j}\) 表示到矩阵 \(A\) 的第 \(i\) 行,前 \([1,i]\) 的秩为 \(j\) 的方案数。转移考虑这一行是否和前面线性无关,如果线性无关,方案数为 \(2^n-2^j\)。否则,我们将 \(C\) 消成一个线性基的形式,如果第 \(i\) 位有值,那么不能被前面表示出来,这一位必须和前面线性无关。否则这一位可以被前面表示出来,但是有若干个限制,表示需要是某几位奇数个 \(1\) 异或出来的。在消成线性基之后,限制互相独立,所以方案书就是 \(2^{j-c}\),其中 \(c\) 表示限制个数。

这样 dp 就可以接受了,时间复杂度 \(O(\frac{n^3}{\omega})\)

submission