n n n个球全部相同, m m m个盒子全部相同,求球全部放入盒子中的方案数。
设答案为
p
n
,
m
p_{n,m}
pn,m
其递推式为:
p
n
,
m
=
p
n
−
m
,
m
+
p
n
,
m
−
1
p_{n,m} = p_{n-m,m} + p_{n,m-1}
pn,m=pn−m,m+pn,m−1
意为和为
n
n
n的
m
m
m个非负整数,可以是和为
n
−
m
n-m
n−m的
m
m
m个非负整数每个都
+
+
++
++得到,也可以是由和为
n
n
n的
m
−
1
m-1
m−1个非负整数加上一个
0
0
0得到。
可以被理解为我们需要对一个空集做
m
m
m次操作,每次把集合中的数都加上一个非负整数后在加入一个
0
0
0到集合中,最后集合的和为
n
n
n的方案数。
我们对集合的和做普通生成函数:
F
i
(
x
)
=
∑
j
=
0
p
j
,
i
x
j
F_i(x) = \sum_{j=0} p_{j,i} x^j
Fi(x)=∑j=0pj,ixj
那么可以得到
F
i
(
x
)
=
F
i
−
1
(
x
)
×
(
∑
j
=
0
x
i
j
)
F_i(x) = F_{i-1}(x) \times (\sum_{j=0} x^{ij})
Fi(x)=Fi−1(x)×(∑j=0xij)
所以答案为
F
m
(
x
)
=
∏
i
=
1
m
1
1
−
x
i
F_m(x) = \prod_{i=1}^m \frac 1{1-x^i}
Fm(x)=∏i=1m1−xi1
我们可以对每个
1
1
−
x
i
\frac 1{1-x^i}
1−xi1求
ln
\ln
ln然后求和后
exp
\exp
exp
ln
(
1
−
x
)
\ln (1-x)
ln(1−x)可以在
x
=
0
x=0
x=0处泰勒展开为
−
∑
i
=
1
x
i
i
-\sum_{i=1} \frac {x^i}i
−∑i=1ixi
ln
(
1
−
x
i
)
=
−
∑
j
=
1
x
i
j
j
\ln (1-x^i) = -\sum_{j=1} \frac {x^{ij}}j
ln(1−xi)=−∑j=1jxij
O
(
m
ln
n
+
n
log
n
)
O(m\ln n + n \log n)
O(mlnn+nlogn)
对于不可相同分拆数,为每次把集合中的数都加上一个正整数后再加入一个 0 0 0到集合中,最后集合的和为 n n n的方案数。(如果要都为正整数,则为再加入一个 1 1 1)
F
m
(
x
)
=
∏
i
=
1
m
x
i
1
−
x
i
F_m(x) = \prod_{i=1}^m \frac {x^i}{1-x^i}
Fm(x)=∏i=1m1−xixi
都为正整数:
F
m
(
x
)
=
∏
i
=
1
m
x
i
+
1
1
−
x
i
F_m(x) = \prod_{i=1}^m \frac {x^{i+1}}{1-x^i}
Fm(x)=∏i=1m1−xixi+1
不可相同分拆数在不限制选的数的上界的情况下都有简单
d
p
dp
dp的
O
(
n
n
)
O(n\sqrt n)
O(nn)算法(因为选的数最多
O
(
n
)
O(\sqrt n)
O(n)个。)
但是可相同就需要用正五边形数才能做到简单
O
(
n
n
)
O(n \sqrt n)
O(nn)算法。