P6076 [JSOI2015] 染色问题

发布时间 2023-09-14 16:23:13作者: FOX_konata

原题

题解里大部分做法要做两次二项式反演,不知为何有点喜感

老规矩,先说我的做法:


方法1:

我一开始也想到了要做两次二项式反演,但感觉好麻烦,于是把一个二项式反演换成了\(dp\),复杂度就差了一些

首先我们发现行列的限制不好容斥,因此我们考虑容斥颜色的限制。具体的,设\(f_i\)表示有至少\(i\)个颜色不选的方案数,\(g_i\)表示恰好有\(i\)个颜色不选的方案数。可以得到\(g_i = \sum_{j=i}^{n}{(-1)^{j-i}\binom{j}{i}f_j}\),于是我们考虑怎么求\(f_i\)

我们考虑一个比较朴素的\(dp\),设\(dp_{i,j,k}\)表示前\(i\)行染了\(j\)列,能染\(k\)种颜色的方案数

可以得到递推式:

\[dp_{i,j,k} = (\sum_{l=0}^{j}{\binom{j}{l} k^l}) \times \sum_{l=0}^{m-j}{\binom{m-j}{l} k^l dp_{i-1,j-l}} \]

其中\(\sum_{l=0}^{j}{\binom{j}{l} k^l}\)表示染过的列也可以再染的方案数;\(\sum_{l=0}^{m-j}{\binom{m-j}{l} k^l dp_{i-1,j-l}}\)则表示这一行中选一些没染的列染掉的方案数

于是我们考虑怎么优化:

首先前面\(\sum_{l=0}^{j}{\binom{j}{l} k^l}\)这部分可以预处理掉,我们不妨设\(s_{i,j} = \sum_{l=0}^{i}{\binom{i}{l} j^l}\)

然后我们推一下\(dp_{i,j-1,k}\),看两个式子有没有什么共同点

\[\begin{align} dp_{i,j-1,k} &= s_{j-1,k} \times \sum_{l=0}^{m-j+1}{\binom{m-j+1}{l} k^l dp_{i-1,j-l-1}} \\ &= s_{j-1,k} \times (\sum_{l=0}^{m-j}{\binom{m-j+1}{l+1} k^{l+1} dp_{i-1,j-l}} + dp_{i-1,j-1}) \\ &= s_{j-1,k} \times (\sum_{l=0}^{m-j}{\frac{(m-j+1)!}{(l+1)!(m-j-l)!} k^{l+1} dp_{i-1,j-l}} + dp_{i-1,j-1}) \\ &= s_{j-1,k} \times (m-j+1)! \times k \times \sum_{l=0}^{m-j}{\frac{k^l dp_{i-1,j-l}}{(l+1)!(m-j-l)!}} + s_{j,k} \times dp_{i-1,j-1} \\ &= ..... \end{align} \]

好吧,推着推着突然发现自己推不下去了,还是直接说结果把:

\[dp_{i,j,k} = (m-j) \times k \times dp_{i,j+1,k} + dp_{i-1,j,k} \times s_{j,k} \]

于是我们就可以\(O(nmc)\)的得到\(dp\)答案,\(f_i = dp_{n,m,c-i}\),最终复杂度\(O(n^3)\)


方法2:

首先我们处理颜色全部使用的限制:设\(f_i\)表示只用了\(i\)中颜色,并且满足行和列染色限制的方案数,可以得到:

\[Ans = \sum_{i=0}^{c}{(-1)^i \binom{c}{i} f_{c-i}} \]

然后我们考虑怎么计算\(f_i\)。我们固定每一行都要染色,选其中的\(k\)列随便染色,然后用二项式反演容斥计算:

\[f_i = \sum_{k=0}^{m}{(-1)^{k} \binom{m}{k} ((i+1)^k-1)^n} \]

其中\((i+1)^k-1\)表示固定的这\(k\)列随便染,而\(-1\)是减掉全为空的情况。最终复杂度\(O(c \log n)\)