【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
我们要巧妙地利用概率的互不相干性,可以分别累加、相乘。在处理复杂问题时,我们不一定要细分每一个状态,一个状态可能有多种可能,累加的时候分别讨论即可。
我们可以跳过中间的状态讨论,得出最后我们到底需要什么。从而精简状态,简化转移。
相关文章推荐
- Android Fragment 真正解析(下)
- hdu4722 Good Numbers(数位dp)
- android static达到Service与Activity于Handler沟通
- Effective C++ 条款34 区分接口继承和实现继承
- Linked List Cycle
- Mac下的LAMP环境
- UIWebView及加载loading界面
- windows mysql安装、配置
- Spark 1.3 新特性 :176个贡献者,1000+ patches
- POJ 2155 Matrix
- windows mysql安装、配置
- Mac 系统开机启动nginx,php
- 回望技术,拥抱产品
- memcache放到哪一层,是service层还是其它层
- java编程中Properties类的具体作用和使用!
- WPF的ComboBox 数据模板自定义
- SQLite数据库数据存储(insert、Delete、update、Select)
- 二十三种设计模式之创建型模式之原型模式
- 关于malloc(0)
- new和二级指针