1.4 KiB
1.4 KiB
冒泡排序趟数期望
题目背景
Ran很喜欢【冒泡排序】,所以出了很多相关的题目,这又是其中一道。
对于一个排列 $a[1...n]$,进行一趟冒泡排序的代码为:
for(int i=1;i<n;++i){
if(a[i]>a[i+1]) swap(a[i], a[i+1]);
}
若排列在 k
趟冒泡排序之后变为有序,则最小的 k
定义为 $res$。
题目描述
给一个长度为 n
的随机排列( n!
种情况等概率出现),请你计算 res
的期望值,对 1e9+7
取模。
例如 n=3
:
a = [1,2,3], res = 0
a = [1,3,2], res = 1
a = [2,1,3], res = 1
a = [2,3,1], res = 2
a = [3,1,2], res = 1
a = [3,2,1], res = 2
期望为 (0+1+1+2+1+2)/6 = 7/6
输入格式
输入一行1个整数 n
输出格式
输出1个整数代表答案
样例 #1
样例输入 #1
3
样例输出 #1
166666669
样例 #2
样例输入 #2
10
样例输出 #2
801586487
样例 #3
样例输入 #3
50
样例输出 #3
123038582
样例 #4
样例输入 #4
12345
样例输出 #4
631836361
样例 #5
样例输入 #5
923456
样例输出 #5
276256848
提示
对于 20% 的数据,n\le 8
对于 40% 的数据,n\le 16
对于 60% 的数据,n \le 3000
对于 80% 的数据,n \le 10^5
对于 100% 的数据,1\le n\le 10^6