1 条题解
-
0
列表生成:题解
思路
对 同时作差分。若原数组长度为 ,就得到 个二维向量 ,满足
$$x_i,y_i\ge0,\quad (x_i,y_i)\ne(0,0),\quad \sum x_i=n,\quad\sum y_i=m.$$因此问题等价于:枚举由若干非零二维步组成、从 走到 的路径,并累加路径顶点数。
做法
二维 DP
令 为走到 的路径数, 为这些路径的顶点数之和。把 看成一条含一个顶点的空路径,则 。对其他格子,前驱可以是左上矩形中的任意不同格子:
$$c_{i,j}=\sum_{(x,y)\ne(i,j)}c_{x,y},\qquad s_{i,j}=\sum_{(x,y)\ne(i,j)}(s_{x,y}+c_{x,y}).$$用二维前缀和可在 时间转移每个状态,得到 算法。
组合公式
固定步数 。先枚举 坐标为正的步数并用插板法分配 ,再给 坐标分配 ;交换求和顺序并使用 Vandermonde 恒等式,可化为只枚举 的公式:
$$\mathrm{Ans}(n,m)=\sum_{i=0}^{\min(n,m)} \binom ni\binom mi \left((i+2)2^s+s2^{s-1}\right), \quad s=n+m-i-1.$$当 时,第二项视为 。预处理阶乘与逆阶乘即可 求组合数;循环中让 每次乘 ,无须保存幂数组。
单维特例
若 ,固定 步时,唯一一次横坐标增量 可放在 个位置,纵坐标的方案数为 。求和可得
$$\sum_{l=1}^{m+1}l(l+1)\binom m{l-1}=2^{m-2}(m^2+7m+8).$$时对称。该式构成独立的 子任务算法。
复杂度
设 。预处理复杂度为 ,每组询问为 ;总空间复杂度为 。
子任务算法
- :递归枚举每一个下一顶点,直接累加所有完整路径的长度。
- :使用单维闭式。
- :使用二维前缀和 DP。
- 无限制:使用组合公式。
- 1
信息
- ID
- 1339
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 10
- 标签
- 递交数
- 1
- 已通过
- 0
- 上传者