数学题

有一个 n × n n\times n n×n 的网格,每个格子有一个 { − 1 , 0 , 1 } \{-1,0,1\} {−1,0,1} 之间的数
对于每行每列的和共 2 × n 2\times n 2×n 个,要求这 2 × n 2\times n 2×n 个数互不相同
若存在一种合法的填法,则称 n n n 是好的,问好的 n n n 有哪些?
加强:给定 n n n,问合法的填法有多少种

解:

  • 首先注意到交换两行或两列并没有影响
    于是我们可以将行和列都按大小排好序,设每个格子的数为 x i , j x_{i,j} xi,j​
    那么就是要求 x i , j ≥ x i , j + 1 , x i , j ≥ x i + 1 , j x_{i,j}\ge x_{i,j+1},x_{i,j}\ge x_{i+1,j} xi,j​≥xi,j+1​,xi,j​≥xi+1,j​,即将网格变成如下的形式

数学题

  • 第二个观察是行和列的和都 ∈ [ − n , n ] \in [-n,n] ∈[−n,n] 共 2 n + 1 2n+1 2n+1 个数
    也就是说只有一个数是不存在与这些和中的
    有结论:对于 2 ∣ n 2\mid n 2∣n, n n n 为好的,否则 n n n 不是好的,证明如下
  • 充分性:我们直接给出如下构造(下面是 n = 6 n=6 n=6 的构造)
    数学题
    对于行,表示出 [ − n + 1 , − n / 2 ] ∪ [ n / 2 + 1 , n ] [-n+1,-n/2]\cup [n/2+1,n] [−n+1,−n/2]∪[n/2+1,n] 的数
    对于列正好为 [ − n / 2 + 1 , n / 2 ] [-n/2+1,n/2] [−n/2+1,n/2] 的所有数
    对于前 n / 2 n/2 n/2 行中的第 i i i 行,每行的前 n − i + 1 n-i+1 n−i+1 个数为 1 1 1,后面的为 0 0 0
    对于后 n / 2 n/2 n/2 行中的第 i i i 行,每行的后 i − 1 i-1 i−1 个为 − 1 -1 −1,前面的为 0 0 0
  • 必要性:为了证明必要性,我们先证一个引理:
    最后的值域只能为 [ − n , n − 1 ] , [ − n + 1 , n ] [-n,n-1],[-n+1,n] [−n,n−1],[−n+1,n] 中的一种
    我们从上面的构造开始调整,首先第一个位置只能调整 − n + 1 -n+1 −n+1 那一排,这必定为造成一列有 t 0 t_0 t0​ 变为 t 0 − 1 t_0-1 t0​−1,于是我们会接着调整 t 0 − 1 t_0-1 t0​−1 的那一排或一列,这必然会导致令一列或一排由 t 1 t_1 t1​ 变为 t 1 − 1 t_1-1 t1​−1,调整会一直进行指导 t k = t 0 t_k=t_0 tk​=t0​,而这个时候会变成值域为 [ − n , n − 1 ] [-n,n-1] [−n,n−1] 的情况
    即每行的和为 x i x_i xi​,列的和为 y j y_j yj​,那么有 ∑ x i = ∑ y j \sum x_i=\sum y_j ∑xi​=∑yj​,而 ∑ x i + ∑ y j = n \sum x_i+\sum y_j=n ∑xi​+∑yj​=n
    故有 ∑ x i = n 2 \sum x_i=\frac n2 ∑xi​=2n​,所以 2 ∣ n 2\mid n 2∣n 是必要的
  • 探究更多性质可以发现,只要能将 [ − n + 1 , n ] [-n+1,n] [−n+1,n] 的数划分成两个大小为 n n n 的集合,使得和为 n 2 \frac n2 2n​
    那么这种方案就是合法的,而对于一个合法的 “标准方案”,任何一个行列置换都会到一个本质不同的情况,所以方案数就是标准方案数 w a y s × 2 × n ! 2 ways\times 2\times n!^2 ways×2×n!2
    对于 w a y s ways ways,即计算 [ x n 2 y n ] ∏ i = − n + 1 n ( 1 + x i y ) = [ x n 2 + n ( n − 1 ) y n ] ∏ i = 0 2 n − 1 ( 1 + x i y ) [x^{\frac n2}y^n]\prod_{i=-n+1}^n(1+x^iy)=[x^{\frac n2+n(n-1)}y^n]\prod_{i=0}^{2n-1}(1+x^iy) [x2n​yn]∏i=−n+1n​(1+xiy)=[x2n​+n(n−1)yn]∏i=02n−1​(1+xiy)
    用多项式技巧可以做到 O ( n 3 log ⁡ n ) \mathcal{O}(n^3\log n) O(n3logn),有更好的做法请不吝赐教
上一篇:Leetcode91. Decode Ways-递归


下一篇:[LeetCode 1712] Ways to Split Array Into Three Subarrays