给一个 n×n 的矩阵,填 0/1,使得:每行 1 的个数都相同,每列 1 的个数互不相同。
n=5 是一个数竞题,是从一个方案的边界小分讨。但是这个随 n 增大是指数级的,只是减了一点。
目前我们的 OI 做法是 f[i][sta],表示考虑前 i 行,每一列 1 的个数状态为 sta。注意到每一行的个数 k 只可能是 2n 取整,而 n 为奇数时上下取整方案数相等,以下取整为例,列为 0,...,n−1;n 为偶数时列为 0,...,2n−1,2n+1,...,n,所以我们可以钦定最终列的状态递增,最后乘 n!,这样复杂度低很多。此外,我们把状态扔到 map 里(多 log,但我甚至不会不带 log 存状态),转移只访问有值的。这个复杂度肯定更低,但是我不会算,不过应当是 n! 级别的(状态数低于 n3,转移要枚举这一行的 Cnk 个状态)。
n=11 跑了 6s,n=13跑了好久才出来。
附表:
n=1,2,3,4,5,6,7,8,9,10,11
ans=
2
2
36
96
26400
151200
919749600
10747699200
1619279453030400
38008104180480000
148176231082711235712000
6916043158135602720768000
715698866739659760701964380160000 (7e32?)