Codeforces 997C Sky Full of Stars

定义 A i 为第 i 行只有一种颜色的颜色集合,定义 B i 为第 i 列只有一种颜色的颜色集合。

则答案转化为求

| A 1 A 2 A n B 1 B 2 B n |

我们使用容斥原理来求解。

由于对称性,计算 A 中一些集合和 B 中一些集合的交集大小并不需要知道两个集合具体包含哪些元素,只需要知道各种颜色的个数。

所以答案转化为下式

a n s = i , j = 0 , i + j > 0 n ( n i ) ( n j ) ( 1 ) i + j + 1 f ( i , j )

其中 f ( i , j ) 代表前 i 行和前 j 列是只有一个颜色的方案数。

对于 f ( i , j ) 的取值分两种情况讨论。

  • 当其中一个参数是 0 时:

    f ( 0 , k ) = 3 k 3 n ( n k )

    解释一下:你需要在前 k 列中“钦定”一种颜色,剩下的任意涂色。

  • 当没有任何一个参数是 0 时:也就是说至少一行和至少一列是完全相同的颜色。不难看出,这一行和这一列应该是相同的颜色,所以:

    f ( i , j ) = 3 3 ( n i ) ( n j )

    解释:先给相同的地方钦定一个颜色,剩下的任意涂色。

求出 f 数组的时间是 O ( n 2 ) ,考虑优化。

O ( n ) 求出所有有一个参数为 0 的情况。然后考虑剩余答案。

a n s = i = 1 n j = 1 n ( n i ) ( n j ) ( 1 ) i + j + 1 3 3 ( n i ) ( n j )

改变枚举量,用 n i 替换 i n j 替换 j
a n s = 3 i = 0 n 1 j = 0 n 1 ( n n i ) ( n n j ) ( 1 ) n i + n j + 1 3 i j

其中 ( n n i ) = ( n i ) , ( 1 ) 2 n = 1 , ( 1 ) i = ( 1 ) i ,得
a n s = 3 i = 0 n 1 j = 0 n 1 ( n i ) ( n j ) ( 1 ) i + j + 1 3 i j

又有二项式定理 ( a + b ) n = i = 0 n ( n i ) a i b n i ,通过它,可以计算固定的 i 时所有 j 的累加和,但是发现当固定 i 时,我们只有 n 1 项,故通过先补再去的方式计算。
a n s = 3 i = 0 n 1 j = 0 n 1 ( n i ) ( n j ) ( 1 ) i + j + 1 3 i j a n s = 3 i = 0 n 1 ( n i ) ( 1 ) i + 1 j = 0 n 1 ( n j ) ( 1 ) j ( 3 i ) j a n s = 3 i = 0 n 1 ( n i ) ( 1 ) i + 1 j = 0 n 1 ( n j ) ( 3 i ) j a n s = 3 i = 0 n 1 ( n i ) ( 1 ) i + 1 [ ( 1 + ( 3 i ) ) n ( 3 i ) n ]

这个式子的计算就是 O ( n ) 的了。

另一个做法

考虑去计算所谓“不幸运”的情况数:每一行和每一列都有不止一种颜色。

如果我们只需要计算所有列都包含不止一种颜色,可以直接得出: ( 3 n 3 ) n

对行使用容斥原理,通过枚举只有 1 个颜色的行的数量。如果这些列的颜色是相同的,那么方案数是 3 ( n i ) ( 3 n i 1 ) n ,因为对于每一列他都不应相同。对于其他的情况,方案数是 ( n i ) ( 3 i 3 ) ( 3 n i ) n

所以最后的答案为

a n s = 3 n 2 ( 3 n 3 ) n i = 1 n ( 1 ) i ( n i ) ( 3 ( 3 n i 1 ) n + ( 3 i 3 ) 3 ( n i ) n )

此做法来自于 fjzzq2002

猜你喜欢

转载自blog.csdn.net/szh_0808/article/details/80895243