abc 232 e 题解

· · 题解

abc 232 e

题意

有一个 n \times m 的矩阵,一开始有个物品放在 (x_1, y_1) 上。

k 次操作,每次操作可以将这个物品移动到同一行或者同一列的另一个格子上。

请你求出在 k 次操作后,使得这个物品到达 (x_2, y_2) 的方法有多少种,对 998244353 取模。

思路

首先,这道题我们先考虑暴力。

那么就有转移: $$dp_{x, y, k} = \sum _ {x' = x, y' \ne y} dp_{x', y', k - 1} + \sum _ {x' \ne x, y' = y} dp_{x', y', k - 1}$$ 所以,状态总数为 $n \times m \times k$,每次有 $n + m$ 种转移,总时间复杂度为 $O(n \times m \times k \times (n + m))$,也就是 $10 ^ {33}$,很明显会超时。 通过打表输出 `dp` 数组,我们可以发现,整个矩阵最后的结果一共可以分为四种: 1. 起点 2. 和起点同行的点 3. 和起点同列的点 4. 和起点不同行也不同列的点 所以,$dp_{k, 0}$ 表示用 $k$ 步走到起点的方案数,$dp_{k, 1}$ 表示用 $k$ 步走到与起点同行的其他的点的方案数,$dp_{k, 2}$ 表示用 $k$ 步走到与起点同列的其他的点的方案数,$dp_{k, 3}$ 表述用 $k$ 步走到和起点不同行也不同列的点的方案数。 那么,转移是什么呢? 我们可以画一个图来看一看。 ![](https://cdn.luogu.com.cn/upload/image_hosting/94rfmk0o.png) ![](https://cdn.luogu.com.cn/upload/image_hosting/vqkey8lu.png) $$dp_{k, 0} = dp_{k - 1, 1} \times (m - 1) + dp_{k - 1, 2} \times (n - 1)$$ ![](https://cdn.luogu.com.cn/upload/image_hosting/trft6zgp.png) $$dp_{k, 1} = dp_{k - 1, 0} + dp_{k - 1, 1} \times (m - 2) + dp_{k - 1, 3} \times (n - 1)$$ ![](https://cdn.luogu.com.cn/upload/image_hosting/70n0bo3l.png) $$dp_{k, 2} = dp_{k - 1, 0} + dp_{k - 1, 2} \times (n - 2) + dp_{k - 1, 3} \times (m - 1)$$ ![](https://cdn.luogu.com.cn/upload/image_hosting/59kwedyp.png) $$dp_{k, 3} = dp_{k - 1, 1} + dp_{k - 1, 2} + dp_{k - 1, 3} \times (n + m - 4)$$ 所以,时间复杂度为 $O(k)$。