# 冒泡排序趟数期望 ## 题目背景 Ran很喜欢【冒泡排序】,所以出了很多相关的题目,这又是其中一道。 对于一个排列 $a[1...n]$,进行一趟冒泡排序的代码为: ```cpp for(int i=1;ia[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$