珂朵莉树(Chtholly Tree),又名老司机树(Old Driver Tree, ODT),可以用来 AC 一类特定的维护序列的题目。珂朵莉树基于 C++ 的 std::set,其核心思想是把序列中相邻且相同的元素合并成一个结点保存在 set 里面,即用 set 中单个结点表示原序列中一整段值相同的子区间。
比如,序列 $$$(3,3,6,5,2,2,2,2)$$$ 的 ODT 有 $$$4$$$ 个结点,分别表示 $$$[1,2]$$$ 中所有元素为 $$$3$$$,$$$[3,3]$$$ 中所有元素为 $$$6$$$,$$$[4,4]$$$ 中所有元素为 $$$5$$$,$$$[5,8]$$$ 中所有元素为 $$$2$$$。
如果一道维护序列的题目包含操作 "将下标 $$$[l,r]$$$ 内元素的值修改为 $$$x$$$",且测试数据完全随机生成,则该序列的 ODT 的结点数量期望为 $$$O(\log n)$$$,于是就可以在这个 set 上暴力处理所有修改和查询的操作。
CBR 正在研究珂朵莉树。他决定从最简单的情况开始:考虑一个包含 $$$n$$$ 个元素的序列,在这个序列上不断执行区间 $$$[l,r]$$$ 随机、值 $$$x$$$ 不重复的修改操作,那么在足够多次操作后,该序列的 ODT 的结点数量的期望是多少?
CBR 知道这个期望值是 $$$O(\log n)$$$ 的,并且他通过大量实验,观察到 $$$n$$$ 较大时该期望值接近 $$$2\ln n$$$。但 CBR 不会算这个期望的准确值,所以他找你帮忙算一算。
第一行是一个正整数 $$$T\ (T\le1000)$$$,代表测试数据的组数;
接下来的 $$$T$$$ 行,每行包含一个正整数 $$$n\ (n\le10^{18})$$$,意义如上所述。
对于每组数据,输出一行,代表 ODT 结点数量的期望值。你的答案的 绝对误差 需要小于 $$$10^{-3}$$$。
5 1 2 3 4 5
1.0000000000000000 1.6666666666666667 2.2000000000000002 2.6428571428571428 3.0202020202020203
区间 $$$[l,r]$$$ 随机:所有区间 $$$[l, r]$$$ 的概率相等