K Killer Sajin's Matrix

题意:给定 n×mn\times m 的矩阵,要求在其中填入 kk11 使得每行每列 11 的个数均为奇数。输出一个合法方案或者报告无解。n,m,k1×105n,m,k \leq 1\times 10^5

解法:(感谢 Oscar 提供的做法)

显然通过不断的交换列与行可以使得所有的 11 都安放在斜对角的矩阵中,且每行每列必然至少有一个 11,如下图的形态:

在这里插入图片描述

设每个满 11 矩阵的长和宽分别为 xi,yix_i,y_i,则有 xi=n\sum x_i=nyi=m\sum y_i=m,同时 xiyi=k\sum x_iy_i=k。注意到 xi,yix_i,y_i 必然为奇数,则矩阵个数与 n,m,kn,m,k 奇偶性相同,所以 n,m,kn,m,k 的奇偶性必须完全相同。

考虑 n,m,kn,m,k 均为奇数的情况。首先考虑一个 3×33\times 3 的基本型:

在这里插入图片描述

对于 3×33\times 3 的矩形,最少需要斜对角的 33 个保证每行每列都有一个 11。可以通过删除中间的一个,增补周围的 33 个变成一个 L 型,使用 5511。通过这一变换使得 11 的个数增加了 22

显然最少需要 max(n,m)\max(n,m)11,此时的放置方案为斜对角的放置 min(n,m)\min(n,m)11,再在最后一行放置 max(n,m)min(n,m)\max(n,m)-\min(n,m)11,如下所示:

在这里插入图片描述

考虑当 11 增多的时候如何修改。显然当 kn+m1k \leq n+m-1 时,我们一直可以将一个 3×33\times 3 的斜对角通过删除中间一个 11,增加周围的 3311 来增加两个 11:(该步操作可以称为 353\to 5在这里插入图片描述

那么当我们达成了 n+m1n+m-1:也就是周围第一列、最后一行全都是 11 之后,对于内侧的 (n1)×(m1)(n-1)\times (m-1),因为 n1,m1n-1,m-1 均为偶数,因而可以一口气放上一个 2×22\times 2 而不影响任何的奇偶性:

在这里插入图片描述

但是这样的操作不会改变 11 的个数对 44 的余数。因而如果 k(n+m1)2(mod4)k-(n+m-1) \equiv 2\pmod 4,则最后一步 353\to 5 操作不应当进行,以调整最后的余数。

在这里插入图片描述

注意到 k=(n1)(m1)2k=(n-1)(m-1)-2 是必然无解的:最后仅剩的两格必然会让所在的行或列不满足要求。

接下来考虑偶数的方案。同样基于该思想,首先构造一个 kk 最小的答案:

在这里插入图片描述

然后以两行为基本单元开始不断调整(省略剩下的 44 行),其基本原理还是逐步增加 22 个格子:

在这里插入图片描述

最大的 kknmmax(n,m)nm-\max(n,m):即反选的答案。

可以参考 Oscar 的代码:https://ac.nowcoder.com/acm/contest/view-submission?submissionId=53401391