Description
在OI界存在着一位传奇选手——QQ,他总是以风格迥异的搞笑代码受世人围观
某次某道题目的输入是一个排列,他使用了以下伪代码来生成数据
while 序列长度<n do
{
随机生成一个整数属亍[1,n]
如果这个数没有出现过则加入序列尾
}
聪明的同学一定发现了,这样生成数据是徆慢的,那么请你告诉QQ,生成一个n排列的期望随机次数
Solution
我们设 fi 表示已经生成了 i 个数的期望次数。
如果这次随机的数不等于已经生成的
如果随机的数等于生成的数,期望次数为:
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
较大的情况用
其中c为欧拉常数,约为0.57721566490153286060651209。
证明请自行查阅。