您的位置:首页 > 其它

【JZOJ】4212 我想大声告诉你

2015-09-09 21:47 183 查看

Description

这个游戏有nn个人参加,每一轮随机选出一个还没有出局的人xx,接着xx 会出局。xx 在出局之后剩下的人会受到一次攻击,每一个人在遭到攻击之后会有pp 的概率被淘汰。(注意遭到攻击淘汰的人是不能攻击剩下的人的)

在所有人都出局或淘汰之后,游戏结束。现在某人想要知道对于每一个0≤k≤n−10 \leq k \leq n - 1,自己恰好在遭受kk次攻击之后出局的概率是多少。

所有数值的运算在模258280327 的意义下进行。

Tips

请注意淘汰和出局的区别。

淘汰是不计入最终答案的。

原题完全没有说清楚。

Brute Force

对于60% 的数据,n≤100n \leq 100

对于100% 的数据,n≤2∗103n \leq 2* 10^3,1≤T≤51 \leq T \leq 5,0≤x<y≤1090 \leq x < y \leq 10^9

所以暴力也挺难想的。

考试时想出来了题意不清楚导致样例都过不了我就不吐槽了。

设状态F[i][k]F[i][k]为我活到剩下ii个人,每个人都被攻击了kk次的概率是多少。

假如我这轮死了(概率为1i\frac{1}{i}),答案kk就可以加上当前概率乘以1i\frac{1}{i}了。【然后我可以不管了反正我出局了】

如果我没死,是其他的某个人死了。这就有可能会造成更多的伤亡。

假设有jj个人因为攻击被淘汰了。

首先我是绝对不能成为淘汰或出局的人中的任何一个的。(i−1−ji\frac{i-1-j}{i})

接着i−1i - 1个人里面选出jj个人一共有很多种可能。(Cji−1C_{i - 1}^{j})

要造成只死jj个人是有一定难度的。((1−p)i−1−j∗pj(1-p)^{i - 1 - j} * p ^ j)

把这些都和当前F[i][k]F[i][k]乘起来就可以累加到F[i−1−j][k]F[i - 1 - j][k]

这是O(n3)O(n ^ 3)

Analysis

我们转化一下问题。

我们把每个人出局或者淘汰的次序看成一个1 to n1 ~to ~n的排列。

这样我们可以得出所有人的出局或者淘汰顺序。

我们设F[i][k]F[i][k]表示当前做到第ii个位置,此时i+1→ni+1\to n都受到了kk次攻击的概率。

我们这个人到底是淘汰出去的呢还是正常出局的呢?

假如我们是是正常出局的,我的出局会对后面造成1次攻击,前提是我在承受k−1k-1次攻击之后活了下来,正常出局。F[i][k]+=F[i−1][k−1]∗(1−p)k−1F[i][k] += F[i - 1][k - 1] * (1-p)^{k - 1}

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

那我们的答案kk就是1n∑n−1i=0F[i][k]∗(1−p)k\frac{1}{n}\sum_{i = 0}^{n - 1}F[i][k] * (1 -p)^k,表示我在ii位置被正常出局的概率。

1n\frac{1}{n}是因为我有1n\frac{1}{n}的几率站在这个排列中的某个确定的位置【就是位置ii啦】

初始F[0][0]=1F[0][0] = 1

这样就是O(n2)O(n^2)

Summary

我们要巧妙地利用概率的互不相干性,可以分别累加、相乘。

在处理复杂问题时,我们不一定要细分每一个状态,一个状态可能有多种可能,累加的时候分别讨论即可。

我们可以跳过中间的状态讨论,得出最后我们到底需要什么。从而精简状态,简化转移。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: