演算法題討論 超大組合數的求解

2021-09-12 07:58:13 字數 1041 閱讀 8816

題目**是一場筆試,第一次筆試慌慌張張,考場中並沒有做出來。以上不表。

直接看題:兩個人小王和小李玩石頭剪刀布的遊戲。一共玩n次。小王贏一次的乙份,輸了不扣分。如果小王得到s分,且已知小李出拳順序,求小王可能的出拳組合總數。

輸入:遊戲場數n,小王遊戲得分s,小李的出拳順序陣列p

在陣列p中,0代表石頭,1代表布,2代表剪刀。

輸入樣例:

3 20 1 2

輸出:可能組合的數目對1e9+7取模

輸出樣例:6

其實就是求小王在n場遊戲中獲證s場的組合數。按照排列組合的思想,就是從n局遊戲中,選出s場來勝利得分(針對一種出拳方式,勝利的方式只有1種),剩下的n-s場不能得分,也就是不能勝利。note:不能勝利就有兩種可能,可以是平局,也可以是輸。這兩種都是不得分的。

設c(m)(n)表示從m個候選中挑出n個的組合數,即等於

m*(m-1)*(m-2)*...*(m-n+1) / n*(n-1)*(n-2)*...*2*1

那麼從n場遊戲中挑s場得分,剩餘n-s場不得分的組合數就是

c(n)(s)*2^(n-s)

簡單說一下原因:前面c(n)(s)表示選哪些場得分哪些場不得分的種數,即一共有c(n)(s)種方法確定得分s場。例如c(3)(2)表示3場遊戲有2場勝利,共有c(3)(2)種方式選擇哪兩場勝利;選定哪些場次勝利哪些場次不勝利之後,還要注意不勝利的場次有兩種出拳方式,那不勝利的場次有(n-s)場,所有不勝利場次出拳則共有2^(n-s)種可能。二者相乘就是總的可能的組合數,即c(n)(s)*2^(n-s)

不知道有沒有敘述清楚,如果以上看不懂,得複習一下本科概率論中關於排列組合的東西了,或者直接看高中課本的排列組合。

本題的重點不在於推出這個組合數,在於n和s的取值範圍都是[1,2000],如果按照常規方法,2000的階乘即2000!肯定是要超過記憶體可以儲存的範圍。

組合數取模的題

聰聰考試 難度級別 c 執行時間限制 1000ms 執行空間限制 262144kb 長度限制 2000000b 試題描述 聰聰是乙個善良可愛 睿智聰慧的好孩子。聰聰是100 的學霸,這一天她在考數學。聰聰很快做到了最後一道題 高一八班有n個人,從1到n編號,一次互判作業時,老師隨機將作業發到這n個人...

動態規劃求解所有字元的組合數

一,問題描述 給定若干個字元,求解 這些字元能夠表示的最多組合個數。比如 一共有七種組合。每種組合沒有重複的字元 且 組合的種數與順序無關,如 ab 和 ba 是同一種組合 a b c ab ac bc abc 其實,求組合個數,可以用公式來求解 具給定 n種字元,一共有 c n,1 c n,2 c...

演算法題 離線公式法求組合數(Python)

給定n組詢問,每組詢問給定兩個整數a,ba,b,請你輸出cba mod 109 7 的值。輸入格式 第一行包含整數n。接下來n行,每行包含一組a和b。輸出格式 共n行,每行輸出乙個詢問的解。資料範圍 1 n 10000 1 b a 2000 輸入樣例 3 3 15 3 2 2輸出樣例 3 101離線...