1 条题解
-
0
一、核心观察
子矩阵中
+和-各两个,等价于任意 子矩阵的四个格子异或和为 。设 (0 表示
$$a_{i,j} \oplus a_{i,j+1} \oplus a_{i+1,j} \oplus a_{i+1,j+1} = 0 $$+,1 表示-),则:
二、参数化通解
可以证明,所有满足上述约束的矩阵可以写成:
其中 是行系数, 是列系数。
验证:
$$(p_i \oplus q_j) \oplus (p_i \oplus q_{j+1}) \oplus (p_{i+1} \oplus q_j) \oplus (p_{i+1} \oplus q_{j+1}) = 0 $$
代入 约束:因为每个 出现两次,每个 出现两次,异或后为 0。
并且这种形式覆盖所有解:固定第一行和第一列即可确定所有 。
三、自由变量计数
- 有 个 和 个 ,但整体同时翻转 和 不影响 (因为 不变)。
- 所以自由变量数为 。
- 无已知条件时,方案数 = 。
四、已知条件的处理
已知 ,则:
这个等式将 和 关联起来。
我们可以建立一个二分图:
- 左部: 个
- 右部: 个
- 对于每个已知条件 ,在 与 之间连一条边,权值为
五、连通分量与自由变量
在二分图中:
- 每个连通分量内,一旦确定一个变量的值,其余变量都唯一确定。
- 设连通分量数为 ,则这些变量中的自由变量数为 (因为可以整体翻转一个连通分量,但全局翻转所有分量不影响 ,所以要减 1)。
未出现在任何边中的 和 是孤立的点,每个都是一个单独的连通分量,可以自由选择 0 或 1。
六、最终自由度数
设实际出现在已知条件中的不同行数为 ,不同列数为 。
设这些节点构成的子图有 个连通分量。则总自由变量数:
$$\text{free} = (n - |SR|) + (m - |SC|) + (comp - 1) $$解释:
- :未出现的行变量,每个自由。
- :未出现的列变量,每个自由。
- :出现的变量中,自由度数。
方案数:
前提是已知条件不自相矛盾。
七、检查一致性
用带权并查集维护二分图:
对每个连通分量维护节点与根节点的异或距离。
加入边 时,检查是否与已有关系矛盾。
如果矛盾,答案直接为 0。
八、总结步骤
- 收集所有已知条件,记录出现的行、列。
- 用并查集建立二分图,检查一致性。
- 若矛盾,输出 0。
- 否则计算:
- 未出现的行数 =
- 未出现的列数 =
- 连通分量数
- 自由变量数 =
- 输出 。
这样推导更简洁,避免了 的枚举,直接使用 的通解形式。
- 1
信息
- ID
- 4293
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 10
- 标签
- 递交数
- 2
- 已通过
- 1
- 上传者