题意
给出一个
n×n
的 0-1方阵
M
,
对
M
中的每个 1,回答:把这个 1 修改为 0 后,
约定: n≤2000 , m≤min(n2,500000)
Sol
可以把方阵的每个行向量取出来,记第 i 个行向量为 vi 。
因为
det(M)≡1
,意味着行向量线性无关,所以任意一个
n
维 0-1向量可以唯一写为这
我们把第
i
维为 1,其它维为
那么对于每一个 1≤i≤n , ei 都可以写为 {vi} 的线性表示。
原问题等价于修改某一个行向量中的某个
1
为
我们记被修改的行向量为
vi
,其中
vi
的第
j
位被修改为
考虑如果行向量线性相关的话,意味着存在一个行向量的子集,满足它们的异或和为
0
。因为原行向量线性无关,所以这个子集一定包括
分析到这里,不难得到:修改 Mi,j 后,不改变行列式的奇偶性的充要条件为: ej 的线性表示中, vi 的系数为 0 。
我们可以通过高斯消元,处理出每个
回顾整个计算过程,实质上是求了 M 的逆矩阵。
对 0-1 矩阵的高斯消元可以利用 bitset 并行计算,时间复杂度