FFT 【JSOI2012】bzoj4332 分零食 (未解决)
很不错的一道倍增优化dp??
第一次做这类题挺难想的
题目大意:
有n个小朋友,m块糖。
给小朋友分糖,如果一个小朋友分不到糖,那他后面的小朋友也分不到糖。
每个小朋友有一个喜悦值,有三个参数,O,S,U,设一个小朋友分到糖数为x,则这个小朋友的喜悦值为O*x x+ S x +U,分不到糖的小朋友的喜悦值为1。
求所有分糖方案下 所有小朋友喜悦值乘积 的和。
题目分析:
首先想到 dp 。g[i][j]g[i][j] 表示前 ii 个小朋友分到 jj 块糖的所有方案 SS 之和,然后答案是 ∑ni=1g[i][m]∑i=1ng[i][m]。
dp方程
g[n][m]=∑i=1mg[n−1][i]×f(m−i)g[n][m]=∑i=1mg[n−1][i]×f(m−i)
(枚举第 nn 个小朋友分到的糖数)。
然后发现是个卷积的形式,于是立刻想到 FFT ,立刻想到倍增 (
g[n]=g[n−1]∗fg[n]=g[n−1]∗f
得到
g[n]=g[0]∗fng[n]=g[0]∗fn
,而 g[0]=1g[0]=1 所以
g[n]=fng[n]=fn
)。但是我们显然要求的是
∑i=1ng[i][m]∑i=1ng[i][m]
只是这样倍增显然是不行的。
于是记
F[n]=∑i=1ng[i]F[n]=∑i=1ng[i]
则 F[n][m]F[n][m] 即为答案。
我们还是可以用倍增的方式求 F[n]F[n] (以下设 nn 为 22 的倍数)。
F[n]=∑i=1ng[i]F[n]=∑i=1ng[i]
F[n]=F[n2]+∑i=n2+1ng[i]F[n]=F[n2]+∑i=n2+1ng[i]
F[n]=F[n2]+∑i=n2+1nfiF[n]=F[n2]+∑i=n2+1nfi
F[n]=F[n2]+∑i=1n2fi+n2F[n]=F[n2]+∑i=1n2fi+n2
F[n]=F[n2]+fn2∑i=1n2fiF[n]=F[n2]+fn2∑i=1n2fi
F[n]=F[n2]+g[n2]∗F[n2]F[n]=F[n2]+g[n2]∗F[n2]
完成!
对于 n mod 2=1n mod 2=1 的情况,可以从 F[n−1]F[n−1] 来计算 F[n]F[n]。可以证明,迭代次数是 log2nlog2n 级别的。
于是就可以开心的使用倍增完成,取膜可以在求完卷积时膜。
复杂度 O(nlog2nlog2m)