2024.11.14 NOIP训练赛
2024.11.14 NOIP 训练赛
Problem
对满足以下条件的 01 矩阵 \(A\) 计数:
- 行数为 \(n+1\) (从 \(0\) 至 \(n\) 标号),列数为 \(k\) (从 \(1\) 至 \(k\) 标号);
- 不存在使得 \(A_{0,i} \sim A_{n-1,i}\) 这 \(n\) 个数都为 \(1\) 的列 \(i\);
- 存在使得 \(A_{1,i} \sim A_{n,i}\) 这 \(n\) 个数都为 \(0\) 的列 \(i\)。
$ \mathcal {O}(nk)$ 做法
先考虑 \(1 \sim n-1\) 这 \(n\) 列。
枚举有 \(i\) 列全填 \(0\),\(j\) 列全填 \(1\),有 \(C_{k}^iC_{k-i}^j\) 种选择;
考虑第 \(0\) 行,全填 \(1\) 的列只能填 \(0\),其他任选,有 \(2^{k-j}\) 种选择;
考虑第 \(n\) 行,没有全填 \(0\) 的列可以任选,全填 \(0\) 的列必须在第 \(n\) 行再填一个 \(0\),有 \(2^{k-i}\times (2^i-1)\) 种选择。
根据乘法原理,可以 \(O(nk)\) 地计算答案。
\(\mathcal{O}(\log n+\log k)\) 做法
利用二项式定理化简答案式子:
\[\begin{aligned}&\quad \sum_{i=0}^k\sum_{j=0}^{k-i} C_k^i \cdot C_{k-i}^j \cdot (2^{n-1}-2)^{k-i-j} \cdot 2^{k-j} \cdot 2^{k-i} \cdot (2^i-1) \\&= \sum_{i=0}^k C_{k}^i \cdot 2^{k-i} \cdot (2^i-1) \cdot \sum_{j=0}^{k-i} C_{k-i}^j \cdot 2^{k-j} \cdot (2^{n-1}-2)^{k-i-j} \\&= \sum_{i=0}^k C_k^i \cdot 2^{k-i} \cdot (2^i-1) \cdot 2^i \cdot \sum_{j=0}^{k-i} C_{k-i}^j \cdot 2^{k-i-j} \cdot (2^{n-1}-2)^{k-i-j}\\&= 2^k \sum_{i=0}^k C_k^i \cdot (2^i-1) \cdot \sum_{j=0}^{k-i} C_{k-i}^j \cdot (2^n-4)^{k-i-j}\\&= 2^k \sum_{i=0}^k C_k^i \cdot (2^i-1) \cdot (2^n-3)^{k-i} \\&= 2^k [\sum_{i=0}^k C_k^i \cdot 2^i \cdot (2^n-3)^{k-i}-\sum_{i=0}^k C_k^i \cdot (2^n-3)^{k-i}]\\&= 2^k [(2^n-1)^k-(2^n-2)^k]\end{aligned}
\]