COGS 2066 七十與十七

2022-05-12 21:31:15 字數 1401 閱讀 6155

七十君最近愛上了排序演算法,於是ta讓十七君給ta講氣泡排序。

十七君給七十君講完了氣泡排序以後,七十君回家苦思冥想,又創造了一種名

為七十排序的演算法。下面是這個演算法排序乙個排列的過程:

首先從左到右掃瞄每個相鄰數對。如果這兩個數是逆序的,則將第二個數(也

就是小的數)放在整個排列的開頭,其他數字置不變,並把計數器加一。如果

沒有逆序的相鄰數對了,就說明已經排好序了,演算法終止。

七十君認為計數器的值反映了這個演算法的執行時間。但十七君覺得七十君發明

的這個演算法會很慢,所以他請你幫忙算算,對於所有長度為n的排列p,

的值,這裡f(p)表示排列p執行演算法結束時計數器的值。

一行乙個整數n。

如果e(n)=a/b,求c使得

bc 三 a  (mod 10^9+7)

並輸出,其中0≤c<10^9+7,如果e不存在輸出-1。

4
250000005
對於排列4 1 3 2,演算法結束時計數器的值為5。

4 1 3 2,4和1形成逆序,將1放到排列最前方。

1 4 3 2,4和3形成逆序,將3放到排列最前方。

3 1 4 2,3和1形成逆序,將1放到排列最前方。

1 3 4 2,4和2形成逆序,將2放到排列最前方。

2 1 3 4,2和1形成逆序,將1放到排列最前方。

1 2 3 4,現在排列已經排序完畢。

e(4)=3.25。

資料範圍與約定

對於20%的資料,n≤8。

對於40%的資料,n≤30。

對於60%的資料,n≤200。

對於1oo%的資料,n≤10^5。

設$\sum_ f(p) = f(n)$。觀察演算法流程可以發現當掃瞄到第n個元素時,前n-1個元素一定有序,所以我們可以考慮遞推求解f函式。現假設p為1到n的排列,最後乙個元素為i,而我們已經事先花費$n * f(n-1) + n!$的時間,讓所有n排列的前n-1個元素有序並將最後乙個元素移至開頭。

現在處理乙個長度為n的滿足$a_1  = n, a_i = i-1(1 < i \leq n)$的排列a,設將它排序所需時間為g(n)。考慮這一過程,我們仍需先將這一排列的前n-1個元素排序,然後將最後乙個元素($a_n = n-1$)移至開頭,此時新序列的第n個元素已經就位,而前n-1個元素仍滿足」排列a「的性質,再按此過程處理一下就可以了。從而有$$g(1) = 0, g(n) = g(n-1) + 1 + g(n-1)(n > 1)$$ 解出$g(n) = 2^ - 1$。

那麼我們就可以得到$$f(n) = n \times (f(n-1) + n!) + (n-1)! \times (\sum_^ g(i))$$那麼$$e(n) = e(n-1) + \frac - 1}$$ 把每輪的1/n改成n的乘法逆元即可。

COGS 2066 七十和十七

輸入檔案 xvii.in輸出檔案 xvii.out簡單對比 時間限制 1 s 記憶體限制 256 mb 七十君最近愛上了排序演算法,於是ta讓十七君給ta講氣泡排序。十七君給七十君講完了氣泡排序以後,七十君回家苦思冥想,又創造了一種名 為七十排序的演算法。下面是這個演算法排序乙個排列的過程 首先從左...

洛谷2066 機器分配

總公司擁有高效裝置m臺,準備分給下屬的n個分公司。各分公司若獲得這些裝置,可以為國家提供一定的盈利。問 如何分配這m臺裝置才能使國家得到的盈利最大?求出最大盈利值。其中m 15,n 10。分配原則 每個公司有權獲得任意數目的裝置,但總台數不超過裝置數m。輸入格式 第一行有兩個數,第乙個數是分公司數n...

luogu p2066 機器分配

做做就知道了 關鍵是我犯了乙個 的問題 我把j當作了機器的下標 然後做了n遍 都沒過 由此可以看出 好了 廢話不多說 開始分析題 要將m臺裝置分給n個公司 按照公司的順序來分配機器,即按照公司的順序劃分階段,第乙個階段把m臺裝置分給第乙個公司,記錄下來獲得的各個盈利值,然後把m臺裝置分給前兩個公司,...