zoukankan      html  css  js  c++  java
  • 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)

  • 相关阅读:
    css font-family(字体样式)
    360浏览器兼容模式,页面不能正常渲染
    SVN 如何更换IP地址
    Update 出现在的问题
    安装node-sass
    vue 里面输出带标签的html
    css 内容超出宽度自动换行
    js 判断各种数据类型
    Java_面向对象三大特征
    Java_基础(二)
  • 原文地址:https://www.cnblogs.com/yinwuxiao/p/8531433.html
Copyright © 2011-2022 走看看