世界盃座位選擇順序總數

來源:互聯網
上載者:User

標籤:組合   排列   世界盃座位   

1. 問題

假設世界盃觀看台上有n個座位,遊客們來到這裡自由佔位。一般情況下,一個遊客首先考慮的座位肯定是兩邊都沒人的座位,其次考慮的是一邊沒人的座位,最後沒得考慮,只能隨便選一張兩邊都是人的座位。 假設有n個遊客依次到場佔位,每個人都是按照上述規則選擇自己的位子,求這n個遊客佔位的可能順序有多少種?

輸入描述: 有多組測試資料,每組測試資料包括一個正整數n(0<n<1000000)。

輸出描述:對於每組資料,由於答案可能會很大,所以輸出:答案%1000000007

2. 分析

需要注意的是:觀眾來的順序是固定的,場地是環形的。

分析:第一批(前幾位)觀眾肯定選擇兩邊沒有人的位置,第二批(接下來)的觀眾肯定選擇一邊沒有人的,第三批(最後)只能選擇兩邊都有人的座位。因此我們可以按批次安排這n個人,即先安排第一批,再安排第二批,最後安排第三批。

定義:當座位為{有人、無人、無人、有人}時,稱這四個座位為TB模組。每個TB模組間隔2個空座位。n為座位元,tb為TB模組個數,interval為間隔個數。

第一批:第一批觀眾入座之後需保證剩下的所有空座位至少一邊有人。

第二批:安排只有一邊沒有人的座位。易得這樣座位的個數與TB模組個數m的兩倍相同,則共有2m*m!種順序。

第三批:安排兩邊均有人的c個座位。顯然共有c!種順序。

我們按照TB模組的個數分情況討論,則對於每種情況共有:pi=(n*Cintervaltb*(interval-1)!)*(2tb*tb!)*((n-interval-tb)!)種情況順序。其中(n*Cintervaltb*(interval-1)!)為第一批,(2tb*tb!)為第二批,((n-interval-tb)!)為第三批。對於第一批來說共有interval個間隔,其中tb個TB模組,因此共有Cintervaltb種座位間隔安排方式,第一個人已經選定位置,因此其他(interval-1)個人共有(interval-1)!種順序,因此第一批共有n*Cintervaltb*(interval-1)!種順序。對於第二批共有tb個TB模組,則共有2tb種安排順序,tb個人共有tb!個順序,因此共有2tb*tb!種順序。剩餘的第三批共有n-interval-tb個座位,因此共有(n-interval-tb)!種順序。

所有情況順序數之和即為最終結果。易得當n為奇數時,tb最小值為1;反之,tb最小值為0。

例1:假設有8個座位,

(1) 情況一:不存在TB模組。第一個人共有8種選擇,當第一個人選定後,其它3個座位也固定下來(如:第一個人選擇位置1,則另外三個座位肯定是3, 5, 7),而接下來的這三個人可以有3!種順序。因此,可得第一批人第一種情況共8*C40*3!種順序。不存在TB模組即不存在第二批安排。最後需要安排的第三批座位元為4,共有4!種順序。由上可得情況一共有p1=8*3!*4!種順序。

(2) 情況二:存在2個TB模組。簡單分析可得不存在一個TB模組的情況。此時間隔數為(8-3*2)/2+2=3個,即一個間隔為1,2個間隔為2。當第一個人固定後,間隔共有C32種分配方案,則該種情況共有8*C32*2!種情況。易得安排第二批人共有22*2!種順序,第三批人共有3!種順序。則情況二共有p2=(8*C32*2!)*(22*2!)*(3!)種順序。

(3) 情況三:存在4個TB模組。顯然對於8不可能,因此第一批人分情況處理完成。

綜上,當座位元為8時共有p1+p2種順序。

注意:上述中每種情況均增加兩個TB模組,直到達到TB模組的上界,則運行終止。

例2:假設有9個座位,

情況一:存在1個TB模組。間隔個數為(9-3*1)/2+1=4個,即3個間隔座位元為1,1個間隔座位元2。當第一個人選定後間隔共有C41種分配方案,則該種共有9*C41*3!種順序。顯然安排第二批人共有21*1!種情況,第三批人共有4!種順序。則情況一共有p3=(9*C41*3!)*(21*1!)*(4!)種順序。

情況二:存在3個TB模組。間隔個數為(9-3*3)/2+3=3個,即0個間隔座位為1,3個間隔座位元為2。當第一個人選定後間隔共有C33種分配方案,則第一批共有9*C33*2!中順序。易得,第二批人共有23*3!種順序,第三批人共有3!種順序。則情況二共有p4=(9*C33*2!)*(23*3!)*(3!)種順序。

情況三:顯然不存在5個TB模組。運行終止。

綜上,當座位元為9時共有p=p3+p4種順序。

由例1與例2可得,當座位元為奇數與偶數時,情況不同。相同的是每種情況遞增2個TB模組。

3. 實現

n為座位元,tb為TB模組個數,interval為間隔個數,num為所有觀眾的順序,則對於每一種情況均有pi=(n*Cintervaltb*(interval-1)!)*(2tb*tb!)*((n-interval-tb)!)。

虛擬碼:

input: n

output: num

num = 0;

if n is odd

     tb = 1;

else

    tb = 0;

interval = (n-3*tb)/2 + tb;

while n ≥ 3*tb

       p=(n*Cintervaltb*(interval-1)!)*(2tb*tb!)*((n-interval-tb)!);

       num += p;

       tb += 2;

      interval--;

 return num;

4. 遺留問題

當只需保留餘數時,階乘的餘數可以在每次相乘之前取餘,即(a*b)%c =((a%c)*(b%c))%c。但Cmn%c如何求解?坐等高人指點迷津……

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.