整数划分

划分为 k 个正整数

(f_{i,j}) 为把 (i) 划分为 (j) 个数的方案数,得:

[large f_{i,j}=f_{i-j,j} + f_{i-1,j-1} ]

整体加 (1) 和新划分 (1)

划分为不重复的 k 个正整数

(f_{i,j}) 为把 (i) 划分为 (j) 个数的方案数,得:

[large f_{i,j}=f_{i-j,j} + f_{i-j,j-1} ]

整体加 (1) 和整体加 (1) 后再新划分 (1)

划分为不大于 m 的不重复的 k 个正整数

(f_{i,j}) 为把 (i) 划分为 (j) 个数的方案数,得:

[large f_{i,j}=f_{i-j,j} + f_{i-j,j-1} - f_{i-(m+1),j-1} ]

整体加 (1) 和整体加 (1) 后再新划分 (1)

(i > m) 时减去后面一项,因为每个数不重复,所以每次转移最多有一个数大于 (m),变为 (m+1),需要减去其贡献。

[HEOI2014]平衡

划分为 k 个奇数

(f_{i,j}) 为把 (i) 划分为 (j) 个奇数的方案数,(g_{i,j}) 为把 (i) 划分为 (j) 个偶数的方案数,得:

[large egin{aligned} f_{i,j}&=g_{i-j,j}+f_{i-1,j-1} \ g_{i,j}&=f_{i-j,j} end{aligned} ]

优化

上面的 (DP) 直接做复杂度都是 (O(n^2)) 的,无法接受,考虑优化。

划分为 k 个正整数

分成两块([1,S-1],[S,n])来计算,最后用乘法原理统计答案。

前一块用直接用完全背包求解。

后一块中被划分的数大于等于 (S),所以原先的 (DP)(j) 只用枚举到 (frac{n}{S}),这里考虑到的最小的数也不再是 (1),而是 (S),于是方程变为:

[large f_{i,j}=f_{i-j,j} + f_{i-S,j-1} ]

复杂度为 (O(n(S+frac{n}{S})))(S=sqrt n) 时最优,复杂度为 (O(nsqrt n))

划分为不重复的 k 个正整数

(j) 个数的最小值为 (sumlimits_{k=1}^j k = frac{j(j+1)}{2} leqslant i),得 (j) 是根号级别的。

五边形数

原文地址:https://www.cnblogs.com/lhm-/p/13499402.html