jzoj5931 氣泡排序

2021-08-30 04:26:46 字數 968 閱讀 2144

氣泡排序的交換次數被定義為交換過程的執行次數。

小 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,底部理解為...