title: 數論經典習題系列之求重集組合數(一)
categories:
n個沒有區別的球放入r個有標誌的盒子裡面(n>=r),每個盒子只允許放乙個球,請問有多少種放法?每個盒子只能放乙個球,所以方法為排列數,p(n,r);
n個沒有區別的球放入r個有標誌的盒子裡面(n>=r),每個盒子至少放乙個球,請問有多少種放法?分兩個步驟完成:
(1)首先每個盒子放乙個球,因為球是沒有區別的,所以這樣的方法是1
(2)然後再n-r個球放到r個盒子裡面,每個盒子放置的球數沒有限制,比如把所有的球都裝到其中乙個盒子,所以盒子相當於是乙個重集:
,\infty\cdot a_,\infty\cdot a_,\cdot \cdot \cdot ,\infty\cdot a_
∞⋅a1,
∞⋅a2
,∞⋅
a3,
⋅⋅⋅,
∞⋅an
}。
結果就是相當於在重集裡面取出n-r個元素的組合
其實就是f(r,n-r)= (r+
n−r−
1r−1
)\binom
(r−1r+
n−r−
1)=(r+
n−r−
1n−r
)\binom
(n−rr+
n−r−
1)=(n−
1r−1
)\binom
(r−1n−
1)
(1)(2)使用乘法定理之後,結果等於(n−
1r−1
)\binom
(r−1n−
1)直接乙個步驟完成,要求盒子不能為空,根據隔板法(可以wiki一下)
r個盒子,n個球,相當於要把n個球劃分為r堆,
因為n個球有n-1的縫隙,要劃分為r堆,就需要找r-1個縫隙。
所以就是在n-1個縫隙裡面找出r-1個縫隙就好了
答案就是(n−
1r−1
)\binom
(r−1n−
1)
JavaScript系列之陣列去重
陣列去重方法是老生常談,特別是一些bat大廠的面試都會提到這個問題,既然是常談,那麼我也來談談 使用迴圈巢狀,最外層迴圈 array,裡面迴圈 res,如果 array i 的值跟 res j 的值相等,就跳出迴圈,如果都不等於,說明元素是唯一的,這時候 j 的值就會等於 res 的長度,根據這個特...
LintCode習題系列之解碼方法
這是筆者在lintcode社群刷題的經歷,希望思考的過程對讀者有所幫助 題目描述 有乙個訊息包含a z通過以下規則編碼 a 1 直到 z 26 現在給你乙個加密過後的訊息,問有幾種解碼的方式 例項 12 1 2 代表ab,12代表l,共兩種情況 思路 首先排除特殊情況 若輸入的string為 則結果...
Spark經典案例之資料去重
資料格式 flie1 2012 3 1 a 2012 3 2 b 2012 3 3 c 2012 3 4 d 2012 3 5 a 2012 3 6 b 2012 3 7 c 2012 3 3 c flie2 2012 3 1 b 2012 3 2 a 2012 3 3 b 2012 3 4 d 2...