您的位置:首页 > 编程语言

【JZOJ3885】搞笑的代码

2017-01-20 21:37 246 查看

Description

在OI界存在着一位传奇选手——QQ,他总是以风格迥异的搞笑代码受世人围观

某次某道题目的输入是一个排列,他使用了以下伪代码来生成数据

while 序列长度<n do
{
随机生成一个整数属亍[1,n]
如果这个数没有出现过则加入序列尾
}


聪明的同学一定发现了,这样生成数据是徆慢的,那么请你告诉QQ,生成一个n排列的期望随机次数

Solution

我们设fi表示已经生成了i个数的期望次数。

如果这次随机的数不等于已经生成的i个数,期望次数为:n−in(fi−1+1)

如果随机的数等于生成的数,期望次数为:in(fi+1)

总的就为:fi=n−in(fi−1+1)+in(fi+1)

于是我们可以解出一个fi和fi−1的关系式,为fi=fi−1+nn−i

这样复杂度就是O(n)的。

但是这题n≤231−1,不能接受。

其实,这题求的就是n∑ni=11i,于是我们可以对调和级数∑ni=11i预处理打表。

还可以对于n较大的情况用ln(n)+c去逼近自然数倒数和。

其中c为欧拉常数,约为0.57721566490153286060651209。

证明请自行查阅。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: