可相同整数拆分数

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=pnm,m+pn,m1
意为和为 n n n m m m个非负整数,可以是和为 n − m n-m nm m m m个非负整数每个都 + + ++ ++得到,也可以是由和为 n n n m − 1 m-1 m1个非负整数加上一个 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)=Fi1(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=1m1xi1
我们可以对每个 1 1 − x i \frac 1{1-x^i} 1xi1 ln ⁡ \ln ln然后求和后 exp ⁡ \exp exp
ln ⁡ ( 1 − x ) \ln (1-x) ln(1x)可以在 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(1xi)=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=1m1xixi
都为正整数:
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=1m1xixi+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 )算法。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值