P4707 重返现世
首先对于这种n个物品凑齐k个的问题肯定是扩展minmax容斥了,然后我们就可以把问题转化为min的问题了,然后又是几何级数的老套路直接变为倒数就是期望次数。
k t h − m a x ( S ) = ∑ T ( − 1 ) k − ∣ T ∣ ( ∣ T ∣ − 1 k − 1 ) f ( T ) kth-max(S)=\sum_{T}(-1)^{k-|T|}\binom{|T|-1}{k-1}f(T) kth−max(S)=T∑(−1)k−∣T∣(k−1∣T∣−1)f(T)
然后我们实际上求解的就是一个背包问题,对于某一个给定的集合大小求解所有的
m
∑
t
∈
T
p
t
\frac{m}{\sum_{t\in{T}}p_t}
∑t∈Tptm
但是我考虑的是使用多项式处理,求解
[
x
∣
T
∣
]
∏
i
=
1
n
(
1
+
1
p
i
x
)
[x^{|T|}]\prod_{i=1}^n(1+\frac{1}{p_i}x)
[x∣T∣]i=1∏n(1+pi1x)
这个我们可以使用分治fft求解,但是多项式处理的背包是权值乘积,没法适用于这种更一般的情况,但是对于可以表示为乘积的背包可以大大优化复杂度。
我们对于这个问题就只能够背包dp了,然后容斥系数包含集合大小所以我们很自然的想法应该是
d
p
i
,
j
,
k
dp_{i,j,k}
dpi,j,k表示前i个原料用了j个,然后
p
i
pi
pi之和为k的方案数。
总的复杂度为
O
(
n
2
m
)
O(n^2m)
O(n2m)
然后考虑优化,这里我们还有k很小这个性质没有利用,然后由于pi之和这一维没法优化,所以我们考虑优化|T|这一维,将这一维去掉,但是这样容斥系数就必须一起处理了,然后对于每次转移时候 ∣ T ∣ |T| ∣T∣会增加1,我们需要按照套路将组合数拆分,这个时候就恰好转化为了|T|不变但是k会变的转移,由于k是很小的所以我们存储k即可。
这个转移的确是真的很妙,巧妙利用组合数加法公式,将上指标的问题转化到下指标。
对于动态规划的关键部分有:1. 状态设计 2. 状态转移 3. 初始条件 4. 答案求解
这4步缺一不可。
这道题的初始条件就很耐人寻味,在 d p 0 , 0 , 0 dp_{0,0,0} dp0,0,0的时候1,其他时候为0,这个定义真的比较微妙。