拆數遊戲?

時間 2021-07-12 04:49:36

1樓:乘著歌聲的翅膀

糾正一下,lz舉的例子有誤,不懂為什麼沒有2+8,a_n應該等於9。

oeis有收錄該數列,將n拆分成至少2個不同大小的整數的個數。這個數列沒有公式表達。

A111133 - OEIS

倒是有個母函式表示式……

2樓:幷州達人

太久沒複習組合方面的概念,反而想多了。題主的問題其實不需要涉及到貝爾數……不過姑且先把答案留這兒吧。

如果把乙個數分為多個不同的數相加的話,隱約記得leetcode上就有類似的演算法題,我記得沒有O(1)解法,也要用遞迴和動態規劃解決,換句話說,也沒有通項公式。

以下是最開始的回答

這是乙個組合學概念,叫做貝爾數,可以理解為把N個物件分為進行分組的話,總共有多少種分組方式。

直接求貝爾數有些難,所以一般會退而求其次的去求另乙個東西,叫做斯特勞林數,在利用斯特勞林數來求出貝爾數。

斯特勞林數(這裡特指第二類斯特勞林數),意味著把N個東西,分成K組,有多少種分法,一般寫作S(n,k)。

當K為一些特殊數的時候,其實求斯特勞林數很簡單。

比如K為1的時候,意味著把N個東西分為1組,有多少分法,很明顯。只有一種分法。

當然 N為一些特殊數的時候,求的斯特勞林數也會很簡單,比如N為1的時候,如果k也為1,那就只有一種分法,如果K大於1,那就由0種分法,也就是,1個東西不可能分成兩份以上。

然後我們又發現了乙個斯特勞林數的遞推公式。

S(n,k) = S(n-1,k-1)+k*S(n-1,k)

可以這麼想,假設我們想把N個東西分成K份,有兩種情況,第一種情況,我們把前N-1個東西分成K-1份,然後第N個東西自己作為最後乙份,湊成K份。

第二種情況,前面N-1個東西已經可以分成K份了,我們再把最後乙個東西,隨便塞進前面K份裡(也就是說總共有k個選擇可以塞)。

把這種想法轉化成數學公式,就成了上面的寫法。

我們把S(n,k)轉化成 S(n-1,k-1)和S(n-1,k)來表達。不過S(n-1,k-1)和S(n-1,k)也能再次用公式展開,裡面的n和k變得更小。

當我們不斷反覆展開,直到n成為1或者k成為1的時候,這就成了我們上面說的簡單情況,可以直接求出數字了。

那麼怎麼求出原題想要的結果,也就是貝爾數呢? 我們把K=1,k=2,k=3 ……一直到K=n的情況全部求出來,再加起來,就是原題想要的結果了。

這麼求還是挺複雜的,N一旦很大,那麼計算就很複雜。不過暫時也沒有那種只要把N輸入進去,就立刻能出結果的演算法。只能期待組合學能有進一步突破吧。