[學習筆記] 分拆數的幾種求法

  • 對分拆數的多種求法做了簡單的整理。

問題

  • fnf_n 表示將 nn 進行分拆的方案數。
  • 例如,1+1+1+1=1+1+2=1+3=2+2=41 + 1 + 1 + 1 = 1 + 1 + 2 = 1 + 3 = 2 + 2 = 4 ,所以 f4=5f_4 = 5
  • 給出 n105(n105)n \le 10^5(n \le 10^5),求 f1,f2,...,fnf_1, f_2, ..., f_n998244353998244353 取模。

算法一

  • 考慮根號分治,設 S=nS = \sqrt{n}
  • 對於 >S> S 的數,設 gi,jg_{i,j} 表示選了 ii 個數總和爲 i(S+1)+ji(S+1) + j 的方案數,轉移有兩種:
    1. 新加入一個數,初始值爲 S+1S + 1gi,j+=gi1,jg_{i,j} += g_{i - 1, j}
    2. 給之前選的所有數 +1gi,j+=gi,jig_{i,j} += g_{i,j - i}
  • 不難發現,這樣轉移對於每一種拆分都有唯一的構造方式,並且第一維只有 O(n)\mathcal O( \sqrt{n}) 級別,時間複雜度 O(nn)\mathcal O(n \sqrt{n})
  • 求出 >S>S 的數的 DP\text{DP} 數組後,對於 S\le S 的數,暴力揹包 DP\text{DP} 即可,總的時間複雜度 O(nn)\mathcal O(n \sqrt{n})
  • 這應該是最爲通用的做法,常數也比較小。

算法二

  • f0=1f_0 = 1,考慮 fif_i 的生成函數
    F(x)=i=0fixi=i=111xi=exp(i=1ln11xi)\begin{aligned} F(x) &= \sum \limits_{i = 0}^{\infty}f_ix^i \\ &= \prod \limits_{i = 1}^{\infty} \frac{1}{1 - x^i}\\ &= \exp\left(\sum \limits_{i = 1}^{\infty} \ln \frac{1}{1-x^i}\right)\\ \end{aligned}
  • 注意到
    ln11xi=(1xi)(11xi)dx=j=1xijj=2j1jxij=j=1xijj\begin{aligned} \ln \frac{1}{1 - x^i} &= \int (1 - x^i)\left(\frac{1}{1 - x^i}\right)' dx\\ &= \sum \limits_{j = 1}^{\infty}x^{ij} - \sum \limits_{j = 2}^{\infty}\frac{j - 1}{j}x^{ij}\\ &= \sum \limits_{j = 1}^{\infty}\frac{x^{ij}}{j}\\ \end{aligned}
  • 所以
    F(x)=exp(i=1j=1xijj)\begin{aligned} F(x) = \exp\left(\sum \limits_{i = 1}^{\infty}\sum \limits_{j = 1}^{\infty} \frac{x^{ij}}{j}\right)\\ \end{aligned}
  • 可以 O(nlnn)\mathcal O(n \ln n) 預處理出內部係數,再 exp\exp 回去。
  • 總的時間複雜度 O(nlogn)\mathcal O(n \log n)

算法三

  • 還是算法二中的生成函數,由 五邊形數定理 得:
    ϕ(x)=i=1(1xi)=1+k=1(1)kxk(3k1)2\begin{aligned} \phi(x) = \prod \limits_{i = 1}^{\infty} (1 - x^i) = 1 + \sum \limits_{k = 1}^{\infty}(-1)^kx^{\frac{k(3k - 1)}{2}} \end{aligned}
  • 這裏直接引用 visit_world博客中的證明
  • 由於 ϕ(x)F(x)=1\phi(x)F(x) = 1,可以直接多項式求逆,時間複雜度 O(nlogn)\mathcal O(n \log n)
  • 還有一種更簡單的方法, 注意到 ϕ(x)(mod  xn+1)\phi(x)(\mod x^{n + 1}) 中係數不爲 00 的項只有 O(n)\mathcal O(\sqrt{n}) 個,暴力模擬求逆即可,時間複雜度 O(nn)\mathcal O(n \sqrt{n})
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章