浅谈整数拆分的四种方法

DP

  • 对于拆分为 < = n <=\sqrt n <=n 部分,直接背包,对于 > n >\sqrt n >n 的部分由于最多只有 n \sqrt n n 个,因此可以记 f [ i ] [ j ] f[i][j] f[i][j]表示用了 i i i个数,当前总和为 j j j,转移 f [ i ] [ j ] = f [ i − 1 ] [ j − n ] + f [ i ] [ j − i ] f[i][j]=f[i-1][j-\sqrt n]+f[i][j-i] f[i][j]=f[i1][jn ]+f[i][ji],之后合并即可。

五边形数

  • ϕ ( x ) = ∏ ( 1 + x i ) = 1 + ∑ i > 0 ( − 1 ) i ( x i ( 3 i − 1 ) / 2 + x i ( 3 i + 1 ) / 2 ) \phi(x)=\prod (1+x^i)=1+\sum_{i>0}(-1)^i(x^{i(3i-1)/2}+x^{i(3i+1)/2}) ϕ(x)=(1+xi)=1+i>0(1)i(xi(3i1)/2+xi(3i+1)/2),答案的生成函数为 1 ϕ ( x ) \frac{1}{\phi(x)} ϕ(x)1,因此可以直接暴力求逆,复杂度 n n n\sqrt n nn ,如果用多项式求逆就可以做到 n   l o g   n n\ log\ n n log n.

F图

  • 即将拆分方案的数写成一个阶梯,考虑阶梯角的最大正方形的边长为 h h h,那么剩下两边分为两个子阶梯,直接枚举 h h h,那么方案数就是 ∑ h ( ∏ i = 1 h 1 ( 1 − x i ) ) 2 \sum_h(\prod_{i=1}^h\frac{1}{(1-x^i)})^2 h(i=1h(1xi)1)2 h h h n \sqrt n n 级别的,每一次乘上两个 1 1 − x h \frac{1}{1-x^h} 1xh1即可。

Exp

  • l n ( 1 1 − x k ) = ∑ i ≥ 1 x i k i ln(\frac{1}{1-x^k})=\sum_{i\ge1}\frac{x^{ik}}{i} ln(1xk1)=i1ixik(求导推知),那么 l n ( A n s ( x ) ) = ∑ k l n ( 1 1 − x k ) ln(Ans(x))=\sum_kln(\frac{1}{1-x^k}) ln(Ans(x))=kln(1xk1),对于每一个 k k k有值的只有 n / k n/k n/k项,暴力求出 l n ( A n s ( x ) ) ln(Ans(x)) ln(Ans(x))之后直接exp即可。

你可能感兴趣的:(总结反思,学习小计,生成函数,整数拆分,总结,多项式,DP)