第一种
给定n,求把n拆分成若干个不相等的数的方案数。
设
f[i][j]
f
[
i
]
[
j
]
表示把j拆成i个数。
考虑要不要新添加一个数,并把之前的数全部加一。
f[i][j]=f[i−1][j−i]+f[i][j−i]
f
[
i
]
[
j
]
=
f
[
i
−
1
]
[
j
−
i
]
+
f
[
i
]
[
j
−
i
]
由于数不相等,数的个数不超过
n−−√
n
那么时空复杂度
O(nn−−√)
O
(
n
n
)
第二种
我写的很简略,这里有pty的详细解释
给定n,求把n拆分成若干个数的方案数,可以相同。
我们要使用到广义五边形数。
五边形数(非广义)长这样。形如
k∗(3k−1)2
k
∗
(
3
k
−
1
)
2
(盗图)(逃
广义五边形数是
k∗(3k+1)2
k
∗
(
3
k
+
1
)
2
,
k∗(3k−1)2
k
∗
(
3
k
−
1
)
2
前几项是0,1,2,3,5,7,12,15,22
设
P(n)
P
(
n
)
为拆分方案数
五边形数定理:
P(n)−P(n−1)−P(n−2)+P(n−3)+P(n−5)...=0
P
(
n
)
−
P
(
n
−
1
)
−
P
(
n
−
2
)
+
P
(
n
−
3
)
+
P
(
n
−
5
)
.
.
.
=
0
其中P(0)=1,n小于0时P为0。
那么P的递推式是
P(n)=∑k≥1(−1)k+1[P(n−k∗(3k+1)2)+P(n−k∗(3k−1)2)]
P
(
n
)
=
∑
k
≥
1
(
−
1
)
k
+
1
[
P
(
n
−
k
∗
(
3
k
+
1
)
2
)
+
P
(
n
−
k
∗
(
3
k
−
1
)
2
)
]
注意到k的级别是
n−−√
n
的,那么时间复杂度也是
O(nn−−√)
O
(
n
n
)