bdfz_2024_summer/day3/U184510/U184510.md
2024-08-04 08:10:26 +08:00

117 lines
1.4 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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