七十君最近愛上了排序演算法,於是ta讓十七君給ta講氣泡排序。設$\sum_ f(p) = f(n)$。觀察演算法流程可以發現當掃瞄到第n個元素時,前n-1個元素一定有序,所以我們可以考慮遞推求解f函式。現假設p為1到n的排列,最後乙個元素為i,而我們已經事先花費$n * f(n-1) + n!$的時間,讓所有n排列的前n-1個元素有序並將最後乙個元素移至開頭。十七君給七十君講完了氣泡排序以後,七十君回家苦思冥想,又創造了一種名
為七十排序的演算法。下面是這個演算法排序乙個排列的過程:
首先從左到右掃瞄每個相鄰數對。如果這兩個數是逆序的,則將第二個數(也
就是小的數)放在整個排列的開頭,其他數字置不變,並把計數器加一。如果
沒有逆序的相鄰數對了,就說明已經排好序了,演算法終止。
七十君認為計數器的值反映了這個演算法的執行時間。但十七君覺得七十君發明
的這個演算法會很慢,所以他請你幫忙算算,對於所有長度為n的排列p,
的值,這裡f(p)表示排列p執行演算法結束時計數器的值。
一行乙個整數n。
如果e(n)=a/b,求c使得
bc 三 a (mod 10^9+7)
並輸出,其中0≤c<10^9+7,如果e不存在輸出-1。
4250000005對於排列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。
現在處理乙個長度為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臺裝置分給前兩個公司,...