题解:AT_agc045_d [AGC045D] Lamps and Buttons
联训讲课的时候的题。讲课大神说他忘了他之前的做法,所以我尝试破译了一下。然后自己手推了一下得到了这么一个不伦不类的神秘做法。
solution
考虑一下 Snuke 应该怎么操作。显然,Snuke 的最优策略是直接贪心的按照
- 如果
P_i 指向一个熄灭的灯,该灯被点亮,Snuke 获得了新的操作机会。 - 如果
P_i 指向一个已亮的灯,且P_i \neq i ,状态反转,但通常不影响连通性。 - 如果
P_i = i 也就是存在自环,且此时灯i 是亮着的,按下后灯i 熄灭。由于P_i=i ,没有任何其他按钮指向i ,灯i 将无法再亮。
Snuke 失败的唯一情况是:在所有初始熄灭的灯(集合
因此,我们可以将胜负条件形式化:
设
- 若不存在这样的
k (即1 \dots A 中无自环),设k = A+1 。 - Snuke 获胜
\iff 集合D 中的每一个元素,都在图上连通至集合S = \{1, \dots, k-1\} 中的某点。 - 换言之,在排列的环分解中,不存在任何一个环,其所有元素均来自
D \cup \{k+1, \dots, A\} 。
我们将问题转化为统计满足上述条件的排列
对于枚举的第一个自环位置
对于固定的
-
-
- 所有包含
D 中元素的环,都必须与S 相交(即包含至少一个S 中的元素)。
考虑上面的限制,只有所有环都与集合
引理: 设
U 是一个大小为n 的集合,指定其中m 个元素组成子集B (B \subset U, |B|=m )。在
U 的所有排列中,使得每一个环都包含至少一个B 中元素的排列总数为:f(n, m) = m \times (n-1)!
:::success[证明]
考虑
对于任意一个圆排列,我们通过断环成链或其他映射对应到线性排列的环分解。
该限制等价于:在圆排列中,所有的非
:::
我们需要计算满足以下条件的方案数:
枚举
- 选出
j 个元素:\binom{A-k}{j} - 剩余
R 中元素任意排列:(A-k-j)! -
对于覆盖点集的方案数,考虑容斥。 总节点集
U = S \cup D \cup \{R_{j}\} ,大小L = (k-1) + (N-A) + j 。\sum_{i=0}^{k-1} (-1)^i \binom{k-1}{i} \times \text{Lemma}(U \setminus i, S \setminus i) 代入引理:
\sum_{i=0}^{k-1} (-1)^i \binom{k-1}{i} \times (k-1-i) \times (L - i - 1)! \tag {1}
把总的式子写出来就是:
上面那个式子直接算上述公式复杂度是
观察
发挥一下贫瘠的注意力。发现式子
记
根据差分性质:
所以
代码非常好写。submission。