注意到值域很小,我们考虑从此入手。假设现在只有 01 两种数,那么我们对一个 A 进行操作后会是什么样子?如果是先行后列,相当于我们对每一行按 0 的数量降序排序且把 0 放在每行最前面;如果是先列后行,相当于我们对每一列按 0 的数量降序排序且把 0 放在每行最前面。 一个 A 合法,肯定需要让其行和列分别构成的可重集相等,并且 A 的可重集和 B 的可重集也一定是相等的。说明我们对 B 进行一些行或列的交换能够得到 A。我们刻画一下这个东西,相当于如果一个 A 合法,当且仅当存在两个排列 p,q,满足 \forall i,j,A_{i,j}=B_{p_i,q_j}。这个东西的数量就是两个可重集的排列数相乘:
注意到 B 中 \le k 的部分是杨表,所以一个位置小于一个数的条件可以简化。设 a_i 表示 B 的第 i 行最后一个 \le k 的位置,b_j 表示第 j 列最后一个 \le k 的位置。现在我们就能将前面的条件继续转化:\forall j\le a_i,p'_i\le b_{q'_j}。考虑到 b 递减,所以当 q'_j 取最大值时限制最严,然后限制就变成了 p'_i\le b_{\max\limits_{j=1}^{a_i}q'_j}。我们令下面那一坨等于 c_i,如果我们知道了 c_i 就能对 p',q' 计数。