题解:AT_agc045_d [AGC045D] Lamps and Buttons

· · 题解

联训讲课的时候的题。讲课大神说他忘了他之前的做法,所以我尝试破译了一下。然后自己手推了一下得到了这么一个不伦不类的神秘做法。

solution

考虑一下 Snuke 应该怎么操作。显然,Snuke 的最优策略是直接贪心的按照 1, 2, \dots, A 的顺序,按亮着的灯。分析一下状态:

Snuke 失败的唯一情况是:在所有初始熄灭的灯(集合 D = \{A+1, \dots, N\})被点亮之前,Snuke 按下了一个自环按钮 k1 \le k \le A)。

因此,我们可以将胜负条件形式化: 设 k 为序列 1, \dots, A 中第一个满足 P_k = k 的下标。

我们将问题转化为统计满足上述条件的排列 P 的数量。

对于枚举的第一个自环位置 k (1 \le k \le A+1),我们将 1 \dots N 分为四个集合:

对于固定的 k,我们需要构造排列满足:

考虑上面的限制,只有所有环都与集合 S 相交这一限制有点麻烦,考虑以下引理:

引理: 设 U 是一个大小为 n 的集合,指定其中 m 个元素组成子集 B (B \subset U, |B|=m)。

U 的所有排列中,使得每一个环都包含至少一个 B 中元素的排列总数为:

f(n, m) = m \times (n-1)!

:::success[证明]

考虑 U 中元素的圆排列。圆排列总数为 (n-1)!

对于任意一个圆排列,我们通过断环成链或其他映射对应到线性排列的环分解。

该限制等价于:在圆排列中,所有的非 B 元素必须在 B 元素之后。

:::

我们需要计算满足以下条件的方案数:

枚举 R 中有 j 个元素加入覆盖范围:

把总的式子写出来就是:

\text{Ans}=\sum_{k=1}^{A} \sum_{j=0}^{A-k} \binom{A-k}{j} (A-k-j)! \times \left[ \sum_{i=0}^{k-1} (-1)^i \binom{k-1}{i} \cdot (k-1-i) \cdot (N - (A-k) + j - i - 2)! \right]

上面那个式子直接算上述公式复杂度是 O(A^3) 的。考虑优化。

观察 (1) 的结构,令 n = k-1,利用恒等式 (n-i)\binom{n}{i} = n\binom{n-1}{i},得:

(1) = n \times \sum_{i=0}^{n-1} (-1)^i \binom{n-1}{i} \times ((N-A) + j + n - 1 - i)!

发挥一下贫瘠的注意力。发现式子 \sum_{i=0}^{m} (-1)^i \binom{m}{i} F(i) 本质上是函数 Fm 阶差分。

\Delta 为差分算子,\Delta F(x) = F(x) - F(x+1)

根据差分性质:\Delta^m F(x) = \Delta^{m-1} F(x) - \Delta^{m-1} F(x+1)

所以 (1) 我们直接递推就可以了。滚掉了一个求和符号。所以复杂度是 O(A^2) 的。

代码非常好写。submission。