Extended Bogo Sort
题号:NC54655
时间限制:C/C++/Rust/Pascal 1秒,其他语言2秒
空间限制:C/C++/Rust/Pascal 256 M,其他语言512 M
64bit IO Format: %lld

题目描述

排序问题是算法领域中一类非常经典的问题。排序算法解决的是这样一个问题:

给定一个实数序列,求出一个序列使得使得.其中是正整数的一个排列。

有很多种不同的算法能解决排序问题,这些算法的应用场景各不相同,消耗的时间空间也各不相同。例如冒泡排序就是一种极其优秀的排序算法,它能在的时间内完成排序任务。

另外,还有一些非常经典的排序算法,例如灭霸排序:随机删除序列中一半的数,重复这一步直到剩下的数是有序的。

在实际的应用当中,最常用(???)的排序算法还是猴子排序,这是一种随机性的算法。算法的核心思想非常简单,只有两步:

1.随机打乱这个序列;

2.检查这个序列是否为有序;如果有序,返回结果;否则回到步骤1。

这个排序算法的优秀点在于:它可能只需要1次打乱操作,遍历1次序列便可完成排序,运行效率极高。但在运气不好时,它可能需要运行很久才能得到正确的结果。然而谁愿意承认自己运气不好呢?所以这个算法的时间效率完爆冒泡排序。

现在要考虑对自然数进行排序的问题。这个序列满足.根据一些简单(?)的数学运算,我们可以知道猴子排序算法中第1步的执行次数大约为n!。这显然有点太多了。于是,zhugezy把猴子排序的算法做了一些改进,以下是他写出的伪代码:

将这段伪代码进行简单的(?)修改,便可以成为一个符合Python语法的Python程序进行运行。不难看出,这段代码在执行时,会随机打乱输入序列。然后一开始,它会检查是否成立;如果成立,则;否则将随机打乱。变量记录了随机打乱的次数,但没有把一开始随机打乱输入序列的那一次计算在内。

现在,对下面这段代码

给定一个正整数,请计算的数学期望。若对“数学期望”的定义有疑惑,请见说明部分。


输入描述:

输入一个整数,表示测试数据组数。

接下来T组数据,每组数据仅一行输入,一个正整数,表示给定的正整数n.

输出描述:

对每组数据,输出一行整数,表示对答案乘以,然后对取余数的结果。

可以证明,答案一定是一个有理数。设答案乘以的结果为且满足,你需要输出的是一个正整数,它满足.可以证明这样的是唯一存在的。意为除以除以的余数相同。
示例1

输入

复制
3
1
2
3

输出

复制
0
666
2664

说明

\mathop n=1,数列无论如何都是有序的,所以期望为0.
\mathop n=2,有\frac{1}{2}的概率\mathop{cnt=0},\frac{1}{4}的概率\mathop{cnt=1},...,以此类推,所以期望为0\cdot\frac{1}{2}+1\cdot\frac{1}{4}+...=1.所以应输出(1\cdot666)\%(10^9+7)=666.
\mathop n=3,输出(4\cdot666)\%(10^9+7)=2664.

备注:

离散型随机变量的数学期望记作.设X有若干种取值x_1,x_2,...,x_n,出现这些取值的对应概率分别为p_1,p_2,...,p_n,则.一般地,有