文章目录

‹
›

川剧复演 题解

川剧复演 题解

题意

有 n 场演出、m 出剧目。每场选一出剧目,同一剧目可重复选。

合法条件:任意连续 m 场演出中,都存在某剧目出现至少两次。

换句话说,不允许出现"连续 m 场两两不同"。

暴力 DP

状态

  • 把"全局约束"翻译成"局部禁止条件"

合法 ⟺ 不存在长度为 m 的连续子段两两不同。

我们从左往右一场一场地安排演出。假设已经安排好了前 i 场,现在要安排第 i+1 场。什么时候会出问题? 出问题当且仅当第 i+1 场安排完后,末尾出现了 m 个两两不同的元素。

所以危险全部来自于序列末尾那一段"两两不同"的后缀。

  • 找到"充分统计量"

我们并不需要知道末尾具体是哪几出剧目,只需要知道一个数字:

末尾最长的、元素两两不同的后缀的长度 j

为什么这个数字就够了?

  • 如果 \(j < m-1\):不管下一场选什么,新的"两两不同后缀"最多变成 \(j+1 < m\),不可能出问题。
  • 如果 \(j = m-1\):下一场绝对不能选一个全新的剧目,否则 \(j\) 就变成 \(m\) 了,非法。

也就是说,未来的所有决策只依赖于 j,不依赖于具体是哪 j 出剧目。这就是这个状态巧妙的地方——它丢掉了所有无关信息,只保留了对决策有用的那一个量。

  • 状态定义

\[f[i][j] = \text{安排了前 } i \text{ 场,且末尾最长两两不同后缀长度恰好为 } j \text{ 的合法方案数} \]

其中 \(0 \le j < m\)(j = m 就非法了,所以状态里不包含 j = m)。

边界:\(f[0][0] = 1\)(空序列,什么都没安排,后缀长度为 0)。

转移

考虑从 \(f[i-1][k]\) 转移过来。当前末尾有 k 个两两不同的元素,现在追加一个新元素 \(x\)。分两种情况:

  • 1. \(x\) 重复了后缀中的某一个元素

后缀中 \(k\) 个元素两两不同,所以 \(x\) 恰好等于其中某一个。假设 \(x\) 等于后缀中倒数第 \(s\) 个元素(\(1 \le s \le k\))。

那么新的"两两不同后缀"就是从倒数第 \(s-1\) 个元素到新元素 \(x\),一共 \(s\) 个元素,且这 \(s\) 个元素两两不同。

对于每个 \(s \in [1, k]\),\(x\) 的选择恰好只有 1 种(就是那个等于倒数第 \(s\) 个元素的剧目),所以:

\[f[i][s] \mathrel{+}= f[i-1][k] \qquad (1 \le s \le k) \]

  • 2. x 是后缀中没有的全新剧目

此时新的两两不同后缀长度变成 \(k+1\),有 \((m - k)\) 种选择(总剧目数减去后缀中已有的 \(k\) 个)。

但注意:只有当 \(k + 1 < m\) 时才合法,否则就凑齐了 \(m\) 个不同元素。所以:

\[f[i][k+1] \mathrel{+}= f[i-1][k] \times (m - k) \qquad (\text{仅当 } k+1 < m) \]

ans

\[\text{ans} = \sum_{j=0}^{m-1} f[n][j] \]

即把所有可能的后缀长度加起来。

复杂度

  • 状态数:\(O(n \cdot m)\)
  • 每个状态转移:情况一需要遍历 \(1 \sim k\),共 \(O(m)\);情况二 \(O(1)\)
  • 总复杂度:\(O(n \cdot m^2)\)

正解:后缀优化 + 矩阵加速

后缀优化

暴力 DP 的转移中,情况一需要对每个 \(s \in [1, k]\) 累加 \(f[i-1][k]\),这是 \(O(m)\) 的。我们用后缀和把它压成 \(O(1)\)。

  • 定义后缀和

设

\[s[i][j] = \sum_{t=j}^{m-1} f[i][t] \]

即从 \(j\) 到 \(m-1\) 的总和。显然 \(s[i][j] - s[i][j+1] = f[i][j]\)。

  • 把转移改写为后缀和的形式

情况一:\(f[i][s] \mathrel{+}= f[i-1][k]\)(对所有 \(k \ge s\)),等价于

\[f[i][s] \mathrel{+}= \sum_{k=s}^{m-1} f[i-1][k] = s[i-1][s] \]

情况二:\(f[i][k+1] \mathrel{+}= f[i-1][k] \times (m-k)\),即

\[f[i][j] \mathrel{+}= f[i-1][j-1] \times (m - j + 1) \qquad (j \ge 1) \]

合并两种情况:

\[f[i][j] = s[i-1][j] + (m - j + 1) \cdot f[i-1][j-1] \]

其中约定 \(f[i-1][-1] = 0\)。

这样对每个 \(j\) 只需要 \(O(1)\) 计算,总复杂度降为 \(O(n \cdot m)\)。

矩阵加速

\(n\) 可以达到 \(10^9\),\(O(n)\) 的线性 DP 无法接受。但注意到状态只有 m 个(\(j = 0, 1, \dots, m-1\)),而且转移是线性的,所以可以用矩阵快速幂。

  • 构造转移矩阵

把 \(f[i-1][0], f[i-1][1], \dots, f[i-1][m-1]\) 看作一个行向量,转移到 \(f[i][0], f[i][1], \dots, f[i][m-1]\)。

由 \(f[i][j] = s[i-1][j] + (m-j+1) \cdot f[i-1][j-1]\),而 \(s[i-1][j] = \sum_{t=j}^{m-1} f[i-1][t]\),所以:

\[f[i][j] = \underbrace{1 \cdot f[i-1][j] + 1 \cdot f[i-1][j+1] + \cdots + 1 \cdot f[i-1][m-1]}_{\text{情况一:所有 } k \ge j} + \underbrace{(m-j+1) \cdot f[i-1][j-1]}_{\text{情况二}} \]

写成矩阵 \(T\)(大小 \(m \times m\)),其中 \(T[k][j]\) 表示 \(f[i-1][k]\) 对 \(f[i][j]\) 的贡献系数:

  • 情况一:当 \(k \ge j\) 时,\(T[k][j] += 1\)
  • 情况二:当 \(k = j-1\) 时,\(T[k][j] += (m - j + 1)\),即 \(T[j-1][j] += m - j + 1\)

矩阵的样子如下(以 \(m = 5\) 为例):

\[T = \begin{pmatrix} 0 & 5 & 0 & 0 & 0 \\ 1 & 1 & 4 & 0 & 0 \\ 1 & 1 & 1 & 3 & 0 \\ 1 & 1 & 1 & 1 & 2 \\ 1 & 1 & 1 & 1 & 1 \\ \end{pmatrix} \]

第 \(k\) 行第 \(j\) 列:下三角(\(k \ge j\))全是 1(情况一),再加上紧邻的右上角元素(\(k = j-1\))为 \(m-j+1\)(情况二)。

初始向量为 \(f[0] = (1, 0, 0, \dots, 0)\),答案为 \(f[n]\) 的所有分量之和。

  • 快速幂

\[f[n] = f[0] \times T^n \]

用矩阵快速幂计算 \(T^n\),复杂度 \(O(m^3 \log n)\)。

复杂度

  • 后缀优化后单次转移:\(O(m)\)
  • 矩阵快速幂:\(O(m^3 \log n)\)
  • 总复杂度:\(O(m^3 \log n)\)

对 \(m \le 200\)、\(T \le 5\),\(200^3 \times 30 \times 5 \approx 1.2 \times 10^9\),略紧但实际可通过。

扩展:线性递推 + 多项式快速幂 \(O(m^2 \log n)\)

矩阵 \(T\) 具有特殊结构,可以推出 \(a_n = \sum_{j=0}^{m-1} f[n][j]\) 满足一个 \(m-1\) 阶线性递推:

\[a_n = d_1 a_{n-1} + d_2 a_{n-2} + \cdots + d_{m-1} a_{n-m+1} \]

其中系数:

  • \(d_1 = m - 1\)
  • \(d_j = (j-1)! \cdot (m - j)\) (\(2 \le j \le m-2\))
  • \(d_{m-1} = (m-2)!\)

用多项式快速幂计算 \(x^{n-1} \bmod p(x)\),其中特征多项式:

\[p(x) = x^{m-1} - d_1 x^{m-2} - d_2 x^{m-3} - \cdots - d_{m-1} \]

若 \(x^{n-1} \equiv c_0 + c_1 x + \cdots + c_{m-2} x^{m-2} \pmod{p(x)}\),则

\[a_n = \sum_{i=0}^{m-2} c_i \cdot a_{i+1} \]

其中 \(a_i = m^i\)(\(i < m\) 时无约束,所有安排都合法)。复杂度 \(O(m^2 \log n)\),对 \(m = 200\) 绰绰有余。

posted @ 2026-10-17 16:43  lvwangshu  阅读(4)  评论(0)    收藏  举报