【JZOJ3885】搞笑的代码

Description

在OI界存在着一位传奇选手——QQ,他总是以风格迥异的搞笑代码受世人围观
某次某道题目的输入是一个排列,他使用了以下伪代码来生成数据

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

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

Solution

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

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

总的就为: fi=nin(fi1+1)+in(fi+1)

于是我们可以解出一个 fi fi1 的关系式,为 fi=fi1+nni

这样复杂度就是O(n)的。
但是这题 n2311 ,不能接受。

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

还可以对于 n 较大的情况用ln(n)+c去逼近自然数倒数和。
其中c为欧拉常数,约为0.57721566490153286060651209。

证明请自行查阅。

posted @ 2017-01-20 21:38  sadstone  阅读(55)  评论(0编辑  收藏  举报