[COGS 2066]七十與十七

http://218.28.19.228/cogs/problem/problem.php?pid=2066

【題目描述】


七十君最近愛上了排序算法,因而Ta讓十七君給Ta講冒泡排序。 php

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

爲七十排序的算法。下面是這個算法排序一個排列的過程: 函數

首先從左到右掃描每一個相鄰數對。若是這兩個數是逆序的,則將第二個數(也 排序

就是小的數)放在整個排列的開頭,其餘數位置不變,並把計數器加一。若是 get

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

七十君認爲計數器的值反映了這個算法的運行時間。但十七君以爲七十君發明 數據

的這個算法會很慢,因此他請你幫忙算算,對於全部長度爲n的排列P, img

   

的值,這裏f(P)表示排列P運行算法結束時計數器的值。 di


【輸入格式】

一行一個整數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_{P.len = N} 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^{N-1} - 1$。       那麼咱們就能夠獲得$$F(N) = N \times (F(N-1) + N!) + (N-1)! \times (\sum_{i = 1}^{N-1} g(i))$$那麼$$E(N) = E(N-1) + \frac{2^{N-1} - 1}{N}$$ 把每輪的1/N改爲N的乘法逆元便可。
相關文章
相關標籤/搜索