Codeforces 997C - Sky Full of Stars
链接
题意
有一个\(n \times n\)的矩阵,用红绿蓝其进行染色,求出至少有一列或者一行为同色的染色方案数。
思路
官方题解:Codeforces Round #493 — Editorial
用\(A_i\)表示第\(i\)行颜色相同的矩阵数量,\(B_i\)表示第\(i\)列颜色相同的矩阵数量。
那么要求的答案即为\(\left| A_1 \bigcup A_2 \dots A_n \bigcup B_1 \bigcup B_2 \dots B_n \right|\)
更一般的,由于对称性,具体的某一行和某一列并不重要,只需要统计有多少行和列满足同色就可以了。
这样得到\(ans = \sum_{i = 0 \dots n, j = 0 \dots n, i + j > 0}{C_n^iC_n^j (-1)^{i + j + 1}f(i, j)}\)。
其中,\(f(i, j)\)表示前\(i\)行\(j\)列同色的矩阵个数。
对于\(i=0\)或\(j=0\)的情况,\(f(0, k) = f(k, 0) = 3^k \cdot 3^{n(n - k)}\),这部分用朴素的方法求和复杂度为\(O(n)\)。
对于其他情况,\(f(i, j) = 3 \cdot 3^{(n - i)(n - j)}\),这部分用朴素的方法求和复杂度为\(O(n^2)\)或\(O(n^2\log n)\),因此需要化简。
\[ans = \sum_{i = 1}^n\sum_{j = 1}^nC_n^iC_n^j (-1)^{i + j + 1}3 \cdot 3^{(n - i)(n - j)}\]
将\(i\)替换为\(n-i\),\(j\)替换为\(n-j\):
\[ans = 3\sum_{i = 0}^{n - 1}\sum_{j = 0}^{n - 1}C_n^{n - i}C_n^{n - j} (-1)^{n - i + n - j + 1}\cdot 3^{ij}\]
由于\(C_n^{n-i} = C_n^i\),\((-1)^{2n}=1\),\((-1)^{-i}=(-1)^i\),得
\[ans = 3\sum_{i = 0}^{n - 1}\sum_{j = 0}^{n - 1}C_n^iC_n^j(-1)^{i + j + 1}\cdot 3^{ij}\]
由于\((a + b)^n=\sum_{i=0}^nC_n^ia^ib^{n-i}\),作如下变换:
\[ans = 3\sum_{i = 0}^{n - 1}C_n^i (-1)^{i + 1}\sum_{j = 0}^{n - 1} C_n^j(-1)^j\cdot \left(3^i\right)^j\]
\[ans = 3\sum_{i = 0}^{n - 1}C_n^i (-1)^{i + 1} \sum_{j = 0}^{n - 1} C_n^j\left(-3^i\right)^j\]
\[ans = 3\sum_{i = 0}^{n - 1}C_n^i (-1)^{i + 1}\left[\left(1 + \left(-3^i\right) \right)^n - \left(-3^i\right)^n\right]\]
可以在\(O(n)\)的时间内完成计算。
代码
1 |
|