P8594 「KDOI-02」一个仇的复

我们考虑到,行与行之间的交互只可能通过一个 \(1\times2\) 的竖着的小长方形来实现,可以把这一部分先丢出去不考虑,先考虑如下子问题:\(i\) 列用 \(k\)个,只能横着放,有多少种方案。

显然我们可以枚举第一行用了几个,有

\[g_{i,k}=\sum_{j=1}^{k-1}\binom{i-1}{j-1}\binom{i-1}{k-j-1}=\sum_{j=0}^{k-2}\binom{i-1}{j}\binom{i-1}{k-j-2}=\binom{2i-2}{k-2} \]

这是好的。同时要注意,使用条件是 \(i\geq 1,k\geq 2\)

接下来我们考虑放置竖着的小长方形,不难想到这样的转移:

\[f_{i,k}=\sum_{j=0}^{i-1}\sum_{l=0}^{k}f_{j,l}g_{i-j-1,k-l-1} \]

显然这样的复杂度是 \(O(n^2k^2)\) ,无法接受。同时考虑到没有什么优化,这说明我们还得在数学角度优化。

可以考虑使用了 \(l\) 个小长方形,我们发现把整个序列分成了 \(l+1\) 段,其中每一段的长度 \(d_i\geq0\),我们再记 \(k_i\) 代表每一段用的个数,此时的答案即为:

\[\prod_{i=1}^lg_{d_i,k_i}=\prod_{i=1}^l\binom{2d_i-2}{k_i-2} \]

但当 \(d_i=0,k_i=0\) 时这个式子应该时 \(1\) 而非 \(0\),所以我们还要进行一些特殊讨论,有点麻烦。

我们考虑把这个要进行讨论的点提前,也就是说,我们在枚举 \(l\) 的同时枚举 \(m\) 代表整个序列被分成 \(m\) 段,其中 \(d_i\geq1,k_i\geq2,\sum d_i=n-l,\sum k_i=k-l\)。此时的答案为:

\[\prod_{i=1}^m\binom{2d_i-2}{k_i-2} \]

再考虑上如何选择 \(1\times2\) 的长方形使得分成 \(m\) 段,\(\sum_{i=0}^mx_i=l,where \ x_0,x_m\geq 0,x_i\geq 1\)总答案:

\[ans=\sum_{l=0}^k\sum_{m=1}^{l+1}\binom{l+1}{m}\sum_{\sum d_i=n-l}\sum_{\sum k_i=k-l}\prod_{i=1}^m\binom{2d_i-2}{k_i-2} \]

考虑先固定 \(l,m,d_i\),此时

\[\sum_{k_i}\prod_{i=1}^m\binom{2d_i-2}{k_i-2}=\binom{2n-2l-2m}{k-l-2m} \]

这同时说明,上面这个答案和 \(d_i\) 的具体值无关。

\[\begin{aligned}ans&=\sum_{l=0}^k\sum_{m=1}^{l+1}\binom{l+1}{m}\sum_{\sum d_i=n-l}\binom{2n-2l-2m}{k-l-2m}\\&=\sum_{l=0}^k\sum_{m=1}^{l+1}\binom{l+1}{m}cnt_{\sum=n-l}\binom{2n-2l-2m}{k-l-2m}\\&=\sum_{l=0}^k\sum_{m=1}^{l+1}\binom{l+1}{m}\binom{n-l-1}{m-1}\binom{2n-2l-2m}{k-l-2m}\\\end{aligned} \]

这样,我们就可以 \(O(n+k^2)\) 地计算了。

posted @ 2023-02-21 16:51  PYD1  阅读(60)  评论(0)    收藏  举报