定义
Ai
为第
i
行只有一种颜色的颜色集合,定义
Bi
为第
i
列只有一种颜色的颜色集合。
则答案转化为求
|A1∪A2∪⋯∪An∪B1∪B2∪⋯∪Bn|
我们使用容斥原理来求解。
由于对称性,计算
A
中一些集合和
B
中一些集合的交集大小并不需要知道两个集合具体包含哪些元素,只需要知道各种颜色的个数。
所以答案转化为下式
ans=∑i,j=0,i+j>0n(ni)(nj)(−1)i+j+1f(i,j)
其中
f(i,j)
代表前
i
行和前
j
列是只有一个颜色的方案数。
对于
f(i,j)
的取值分两种情况讨论。
当其中一个参数是
0
时:
f(0,k)=3k⋅3n(n−k)
解释一下:你需要在前
k
列中“钦定”一种颜色,剩下的任意涂色。
当没有任何一个参数是
0
时:也就是说至少一行和至少一列是完全相同的颜色。不难看出,这一行和这一列应该是相同的颜色,所以:
f(i,j)=3⋅3(n−i)(n−j)
解释:先给相同的地方钦定一个颜色,剩下的任意涂色。
求出
f
数组的时间是
O(n2)
,考虑优化。
先
O(n)
求出所有有一个参数为
0
的情况。然后考虑剩余答案。
ans=∑i=1n∑j=1n(ni)(nj)(−1)i+j+13⋅3(n−i)(n−j)
改变枚举量,用
n−i
替换
i
,
n−j
替换
j
ans=3∑i=0n−1∑j=0n−1(nn−i)(nn−j)(−1)n−i+n−j+1⋅3ij
其中
(nn−i)=(ni),(−1)2n=1,(−1)−i=(−1)i
,得
ans=3∑i=0n−1∑j=0n−1(ni)(nj)(−1)i+j+1⋅3ij
又有二项式定理
(a+b)n=∑ni=0(ni)aibn−i
,通过它,可以计算固定的
i
时所有
j
的累加和,但是发现当固定
i
时,我们只有
n−1
项,故通过先补再去的方式计算。
ans=3∑i=0n−1∑j=0n−1(ni)(nj)(−1)i+j+1⋅3ijans=3∑i=0n−1(ni)(−1)i+1∑j=0n−1(nj)(−1)j⋅(3i)jans=3∑i=0n−1(ni)(−1)i+1∑j=0n−1(nj)(−3i)jans=3∑i=0n−1(ni)(−1)i+1[(1+(−3i))n−(−3i)n]
这个式子的计算就是
O(n)
的了。
另一个做法。
考虑去计算所谓“不幸运”的情况数:每一行和每一列都有不止一种颜色。
如果我们只需要计算所有列都包含不止一种颜色,可以直接得出:
(3n−3)n
对行使用容斥原理,通过枚举只有
1
个颜色的行的数量。如果这些列的颜色是相同的,那么方案数是
3(ni)(3n−i−1)n
,因为对于每一列他都不应相同。对于其他的情况,方案数是
(ni)(3i−3)(3n−i)n
所以最后的答案为
ans=3n2−(3n−3)n−∑i=1n(−1)i(ni)(3(3n−i−1)n+(3i−3)3(n−i)n)
此做法来自于
fjzzq2002