- 對分拆數的多種求法做了簡單的整理。
問題
- 令 表示將 進行分拆的方案數。
- 例如, ,所以 。
- 給出 ,求 對 取模。
算法一
- 考慮根號分治,設 。
- 對於 的數,設 表示選了 個數總和爲 的方案數,轉移有兩種:
- 新加入一個數,初始值爲 :;
- 給之前選的所有數
+1
: 。
- 不難發現,這樣轉移對於每一種拆分都有唯一的構造方式,並且第一維只有 級別,時間複雜度 。
- 求出 的數的 數組後,對於 的數,暴力揹包 即可,總的時間複雜度 。
- 這應該是最爲通用的做法,常數也比較小。
算法二
- 令 ,考慮 的生成函數
- 注意到
- 所以
- 可以 預處理出內部係數,再 回去。
- 總的時間複雜度 。
算法三
- 還是算法二中的生成函數,由
五邊形數定理
得:
- 這裏直接引用 visit_world博客中的證明。
- 由於 ,可以直接多項式求逆,時間複雜度 。
- 還有一種更簡單的方法, 注意到 中係數不爲 的項只有 個,暴力模擬求逆即可,時間複雜度 。