矩阵乘法.
dp 显然可以写成转移矩阵的形式.
记 $v$ 为长度为 $K$ ,值全为 $1$ 的列向量, $w$ 为长度为 $K$ ,仅第一个值为 $1$ 的行向量, $T_i$ 表示第 $i$ 个数对应的转移矩阵.
那么询问 $[l,r]$ 的答案就是
$$
(w(\prod_{i=l}^r T_i)v)_{0,0}
$$
注意到转移矩阵 $T_i$ 有逆,且逆是容易直接求出的,于是可以考虑维护转移矩阵前缀积,以及逆矩阵的前缀积.
记 $x_i=T_1T_2T_3\cdots T_iv,y_i=wT_{i}^{-1}\cdots T_{3}^{-1}T_2^{-1}T_1^{-1}$ ,则询问的答案为 $(y_{l-1}x_r)_{0,0}$ .
$T_i$ 和 $T_{i}^{-1}$ 都只有 $O(k)$ 个位置有值,于是右乘 $T_{i}$ 与左乘 $T_{i}^{-1}$ 都可以 $O(K^2)$ 完成.
时间复杂度 $O(nK^2+qK)$ .
1 | //%std |