bdfz_2024_summer/day3/U184510/U184510.md

1.4 KiB
Raw Permalink Blame History

冒泡排序趟数期望

题目背景

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