Description
这个游戏有
n
个人参加,每一轮随机选出一个还没有出局的人
在所有人都出局或淘汰之后,游戏结束。现在某人想要知道对于每一个
所有数值的运算在模258280327 的意义下进行。
Tips
请注意淘汰和出局的区别。
淘汰是不计入最终答案的。
原题完全没有说清楚。
Brute Force
对于60% 的数据,
对于100% 的数据,
n≤2∗103
,
1≤T≤5
,
0≤x<y≤109
所以暴力也挺难想的。
考试时想出来了题意不清楚导致样例都过不了我就不吐槽了。
设状态
F[i][k]
为我活到剩下
i
个人,每个人都被攻击了
假如我这轮死了(概率为
1i
),答案
k
就可以加上当前概率乘以
如果我没死,是其他的某个人死了。这就有可能会造成更多的伤亡。
假设有
j
个人因为攻击被淘汰了。
首先我是绝对不能成为淘汰或出局的人中的任何一个的。(
接着
i−1
个人里面选出
j
个人一共有很多种可能。(
要造成只死
j
个人是有一定难度的。(
把这些都和当前
F[i][k]
乘起来就可以累加到
F[i−1−j][k]
这是 O(n3)
Analysis
我们转化一下问题。
我们把每个人出局或者淘汰的次序看成一个
1 to n
的排列。
这样我们可以得出所有人的出局或者淘汰顺序。
我们设
F[i][k]
表示当前做到第
i
个位置,此时
我们这个人到底是淘汰出去的呢还是正常出局的呢?
假如我们是是正常出局的,我的出局会对后面造成1次攻击,前提是我在承受
假如我们是被淘汰的,我的淘汰并不会对后面的人有影响,我不会造成攻击然后默默地死去= =,这就是我在这 k 次攻击中没能顺利活下来所付出的代价。
那我们的答案
k
就是
初始
这样就是 O(n2)
Summary
我们要巧妙地利用概率的互不相干性,可以分别累加、相乘。
在处理复杂问题时,我们不一定要细分每一个状态,一个状态可能有多种可能,累加的时候分别讨论即可。
我们可以跳过中间的状态讨论,得出最后我们到底需要什么。从而精简状态,简化转移。