K Killer Sajin's Matrix
题意:给定 的矩阵,要求在其中填入 个 使得每行每列 的个数均为奇数。输出一个合法方案或者报告无解。。
解法:(感谢 Oscar 提供的做法)
显然通过不断的交换列与行可以使得所有的 都安放在斜对角的矩阵中,且每行每列必然至少有一个 ,如下图的形态:
设每个满 矩阵的长和宽分别为 ,则有 ,,同时 。注意到 必然为奇数,则矩阵个数与 奇偶性相同,所以 的奇偶性必须完全相同。
考虑 均为奇数的情况。首先考虑一个 的基本型:
对于 的矩形,最少需要斜对角的 个保证每行每列都有一个 。可以通过删除中间的一个,增补周围的 个变成一个 L 型,使用 个 。通过这一变换使得 的个数增加了 。
显然最少需要 个 ,此时的放置方案为斜对角的放置 个 ,再在最后一行放置 个 ,如下所示:
考虑当 增多的时候如何修改。显然当 时,我们一直可以将一个 的斜对角通过删除中间一个 ,增加周围的 个 来增加两个 :(该步操作可以称为 )
那么当我们达成了 :也就是周围第一列、最后一行全都是 之后,对于内侧的 ,因为 均为偶数,因而可以一口气放上一个 而不影响任何的奇偶性:
但是这样的操作不会改变 的个数对 的余数。因而如果 ,则最后一步 操作不应当进行,以调整最后的余数。
注意到 是必然无解的:最后仅剩的两格必然会让所在的行或列不满足要求。
接下来考虑偶数的方案。同样基于该思想,首先构造一个 最小的答案:
然后以两行为基本单元开始不断调整(省略剩下的 行),其基本原理还是逐步增加 个格子:
最大的 为 :即反选的答案。
可以参考 Oscar 的代码:https://ac.nowcoder.com/acm/contest/view-submission?submissionId=53401391