【JZOJ】4212 我想大声告诉你

来源:互联网 发布:浙江挂号12580软件 编辑:程序博客网 时间:2024/04/28 20:20

Description

这个游戏有n个人参加,每一轮随机选出一个还没有出局的人x,接着x 会出局。x 在出局之后剩下的人会受到一次攻击,每一个人在遭到攻击之后会有p 的概率被淘汰。(注意遭到攻击淘汰的人是不能攻击剩下的人的)
在所有人都出局或淘汰之后,游戏结束。现在某人想要知道对于每一个0kn1,自己恰好在遭受k次攻击之后出局的概率是多少。
所有数值的运算在模258280327 的意义下进行。

Tips

请注意淘汰和出局的区别。
淘汰是不计入最终答案的。
原题完全没有说清楚。

Brute Force

对于60% 的数据,n100
对于100% 的数据,n21031T50x<y109

所以暴力也挺难想的。
考试时想出来了题意不清楚导致样例都过不了我就不吐槽了。

设状态F[i][k]为我活到剩下i个人,每个人都被攻击了k次的概率是多少。
假如我这轮死了(概率为1i),答案k就可以加上当前概率乘以1i了。【然后我可以不管了反正我出局了】
如果我没死,是其他的某个人死了。这就有可能会造成更多的伤亡。
假设有j个人因为攻击被淘汰了。
首先我是绝对不能成为淘汰或出局的人中的任何一个的。(i1ji
接着i1个人里面选出j个人一共有很多种可能。(Cji1
要造成只死j个人是有一定难度的。((1p)i1jpj
把这些都和当前F[i][k]乘起来就可以累加到F[i1j][k]

这是O(n3)

Analysis

我们转化一下问题。
我们把每个人出局或者淘汰的次序看成一个1 to n的排列。
这样我们可以得出所有人的出局或者淘汰顺序。
我们设F[i][k]表示当前做到第i个位置,此时i+1n都受到了k次攻击的概率。
我们这个人到底是淘汰出去的呢还是正常出局的呢?
假如我们是是正常出局的,我的出局会对后面造成1次攻击,前提是我在承受k1次攻击之后活了下来,正常出局。

F[i][k]+=F[i1][k1](1p)k1

假如我们是被淘汰的,我的淘汰并不会对后面的人有影响,我不会造成攻击然后默默地死去= =,这就是我在这k次攻击中没能顺利活下来所付出的代价。
F[i][k]+=F[i1][k](1(1p)k)

那我们的答案k就是1nn1i=0F[i][k](1p)k,表示我在i位置被正常出局的概率。
1n是因为我有1n的几率站在这个排列中的某个确定的位置【就是位置i啦】

初始F[0][0]=1

这样就是O(n2)

Summary

我们要巧妙地利用概率的互不相干性,可以分别累加、相乘。
在处理复杂问题时,我们不一定要细分每一个状态,一个状态可能有多种可能,累加的时候分别讨论即可。
我们可以跳过中间的状态讨论,得出最后我们到底需要什么。从而精简状态,简化转移。

0 0
原创粉丝点击