氣泡排序的交換次數被定義為交換過程的執行次數。
小 s 開始專注於研究⻓度為 n 的排列,他想知道,在你運氣足夠好的情況下(即每次氣泡排序的交換次數都是可能的最少交換次數,彷彿有上帝之手在操控),對於乙個等概率隨機的長度為n 的排列,進行這樣的氣泡排序的期望交換次數是多少?
ion的梗玩到現在真是
一開始看到那兩個rand還以為不可做。。。可啪
由於題目告訴我們交換次數一定最小,考慮怎麼求乙個排列的最小交換次數。我們把每個數字和下標連邊,記形成環的數量為s,乙個環內最小交換次數為size-1,可知總的交換次數最小為n-s
現在考慮怎麼求環的期望數量。我們令f[i]為i個數排列形成環的期望數量,顯然有f[i]=f[i-1]+w,其中w是i形成新的環的概率。可以發現i只有放在位置i會自成乙個環,因此答案為∑i=
1n1i
\sum\limits_^n \frac
i=1∑n
i1然後就線性求個逆元字首和就沒了。。
#include
#include
#define rep(i,st,ed) for (int i=st;i<=ed;++i)
typedef
long
long ll;
const
int mod=
998244353
;const
int n=
10000005
;ll inv[n]
,s[n]
;int
main
(void
)int t;
for(
scanf
("%d"
,&t)
;t--;)
return0;
}
Jzoj3542 氣泡排序
下面是一段實現氣泡排序演算法的c for int i 1 i n i for int j 1 j n i j if a j a j 1 swap a j a j 1 其中待排序的a陣列是乙個1 n的排列,swap函式將交換陣列中對應位置的值。對於給定的陣列a以及給定的非負整數k,使用這段 執行了正好...
JZOJ3542氣泡排序
下面是一段實現氣泡排序演算法的c for int i 1 i n 1 i for int j 1 j n i j if a j a j 1 swap a j a j 1 其中待排序的a陣列是乙個1 n的排列,swap函式將交換陣列中對應位置的值。對於給定的陣列a以及給定的非負整數k,使用這段 執行了...
氣泡排序 排序 氣泡排序
既然寫了計組思來想去便打算把資料結構也寫下來,寫的時候總是發現看的時候無法發現的問題,受益良多。交換排序的基本思想 exchange until sorted 順序,分支,迴圈 注意偽 的熟悉 下面介紹兩種交換演算法 首先進行聯想,用乙個圖進行輔助聯想 水冒泡過程 頂部是陣列的begin,底部理解為...