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[n1][i]×f(mi)g[n][m]=∑i=1mg[n−1][i]×f(m−i)

(枚举第 nn 个小朋友分到的糖数)。 
然后发现是个卷积的形式,于是立刻想到 FFT ,立刻想到倍增 (

 
g[n]=g[n1]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]+fn2i=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[n1]F[n−1] 来计算 F[n]F[n]。可以证明,迭代次数是 log2nlog2n 级别的。 
于是就可以开心的使用倍增完成,取膜可以在求完卷积时膜。

复杂度 O(nlog2nlog2m)

posted @ 2018-03-08 23:02  尹吴潇  阅读(121)  评论(0编辑  收藏  举报