考虑给定一个操作序列,如何计算它的概率:第一个随从死亡前,每次操作的概率是 $\frac1n$;第一个随从死亡后,第二个随从死亡前,每次操作的概率是 $\frac{1}{n-1}$;……。不妨用 DP 来计算这个概率。
设 $dp[S][t]$ 表示集合 $S$ 里的随从已经死亡,$S$ 最后一个死亡的随从是在第 $t$ 次操作后死亡的概率。预处理组合数后,这个 DP 的值可以在 $O(2^nnm)$ 的时间内算出。
要统计答案,假设死亡的随从集合是 $S$,则需要计算攻击除 $S$ 外的随从共 $m-\sum_{i\in S}a_i$ 次且没有随从死亡的方案数。朴素计算的复杂度为 $O(nm^2)$,在 DFS 过程中计算可以除掉 $n$。也可以 Meet in the middle,在 $O(2^{n/2}m^2)$ 的时间内预处理两部分所有子集的答案,就可以用 $O(m)$ 的时间计算一项答案。
最终的时间复杂度为 $O(2^{n/2}m^2+2^nnm)$。