關於小球放箱子的8種情況解法及證明

2021-09-23 22:25:20 字數 1884 閱讀 7265

總結我只是個小蒟蒻,所以數論證明方面嘛....

..比較感性,可能不嚴謹

倘若有哪些大佬發現有bug

bugbu

g,那歡迎提醒我

因為在週末比賽時遇上了一道jzoj 4786...

..結果冒出來一堆野雞,貼公式乙個比乙個熟練,但對於證明卻只口未提

所以為了方便各位,便在感悟後mar

kmark

mark

下設有n

nn個小球,m

mm個箱子

設f [i

][j]

f[i][j]

f[i][j

]表示在有j

jj個箱子的情況下放入i

ii個小球的方案數

我們開始考慮動態轉移方程:

我們從限制入手:允許有空箱。即可有可無,對於無的情況,假設有j

jj個箱子,我們大可以在操作前先保證每個箱子內有1

11個球,所以要放入的球就從i

ii變成i−j

i-ji−

j;對於有的情況,就很好考慮了。因為可以有空箱,那麼就直接加上乙個箱子,讓i

ii個小球自己去排(因為之前的dpdp

dp必定會使其有解)。

現在動態轉移方程便呼之欲出了:

f[i][j]=f[i][j-1 ]+f[i-j][j](i>=j) \\ f[i][j]=f[i][j-1 ](i

^mf[n][i]

ans=∑i

=1m​

f[n]

[i]

因為不能存在空箱的情況,也就是說我們只有讓m

mm個箱子都有球才符合,所以按照上一種的方法dpdp

dp,統計答案時就直接是f[n

][m]

f[n][m]

f[n][m

] 對於n

nn個球來說,就會存在n−1

n-1n−

1個位置,而因為我們只有m

mm個箱子,所以只要m−1

m-1m−

1個位置便可以成功的將小球分成m

mm份。但因為可以有空箱,那麼情況就會變得十分特殊,所以我們可以強行新增m

mm個球使得每個箱子都會有球,也就是不存在空箱的情況了,這下就巧妙的將特殊化為一般

所以就變成了在n+m

−1

n+m-1

n+m−

1個位置中選出m−1

m-1m−

1的方案數,即cn+

m−1m

−1

c_^cn

+m−1

m−1​

因為一開始就不存在空箱的情況,所以就不需要新增m

mm個虛球,直接用上一種情況一開始提到的就好了,即方案數為cn−

1m−1

c_^cn

−1m−

1​這種情況就十分草率了,對於每個球都可以有m

mm個箱子選擇且使得方案不重複

所以解就是n

mn^m

nm讓我們再次回到球不同,箱同,無空箱這種情況,與現在這種情況僅僅差了箱子的不同

那麼我們大膽地嘗試由該種情況直接進行轉移。因為考慮的是箱子,所以我們直接對於結果進行考慮。因為箱子的不同,所以在球數一定的情況下,只要換個箱子都會使得方案數改變,而我們可以換且不會發生重複的方案,恰好是m

mm個箱子的全排列

最終的方案數為f[n

][m]

∗m

!f[n][m]*m!

f[n][m

]∗m!

感覺思考時最大的體會就是賴皮

跟講n im

nimni

m博弈時運用到的反證法一樣,很巧妙,在考慮一種情況時,因為可能會出現特殊情況而導致難度上公升,所以我們直接將球預先放好,對特殊情況進行降難度打擊

關於RMQ問題的四種解法

什麼是rmq問題 rmq range minimum maximum query 對於長度為n的陣列a,回答若干詢問rmq a,i,j i,j n 1 返回陣列a中下標在i,j範圍內的最小 大 值,也就是說,rmq問題是指求區間最值的問題。1.暴力法最簡單的方法,就是遍歷陣列直接搜尋,但是這種方式時...

關於記憶體溢位遇到的兩種情況

1.處理資料的程式或者服務是x86架構的,容易出現記憶體溢位。因為x86的程序,最多允許記憶體4g 在這4g中又有2g是作業系統等 所以當你查詢的資料量非常大的時候,非常容易記憶體溢位。2.多執行緒 容易導致記憶體溢位 溢位原理細節我還不清楚 我查詢mongo資料量,資料按地區分類,我查到a地區有7...

關於HTTP的8種請求方式簡介

有次面試時被問到http除了get和post還有什麼請求方式嗎?除了知道乙個head,真的是一臉懵逼,哎。直接gg。接下來介紹下這8種請求方式 1.get 向特定資源傳送請求,查詢資料 2.post 向指定的資源,提交資料進行處理請求,有可能建立或修改已有資料 3.head 和get請求相一致,只不...