zoukankan      html  css  js  c++  java
  • 付公主的背包

    一、题目

    点此看题

    二、解法

    直接做背包有点难,不妨试一试生成函数,设 (G(x)) 表示物品 (i) 的生成函数,那么:

    [G(x)=1+x^{v}+x^{2v}....=frac{1}{1-x^{v}} ]

    直接生成函数卷积没有帮助,所以我们对闭形式搞点事情,不难发现答案是所有闭形式相乘再展开。也就是 (prodfrac{1}{1-x^v}),我们求出 (prod(1-x^v)) 再使用多项式求逆即可,但是这时候暴力乘起不到任何优化效果。

    下面的操作就难以置信了。化乘为加是常用技巧,可以用取对数实现,那么我们来看看对 (1-x^V) 取对数会产生什么东西:

    [ln(1-x^v) ]

    因为 (ln(x')=frac{1}{x}),所以可以尝试求导来去掉 (ln),设 (F(x)=1-x^v)

    [ln(F(x'))=frac{F'(x)}{F(x)}=frac{-vx^{v-1}}{1-x^v} ]

    这个东西其实是母函数的闭形式,我们将其展开:

    [=-sum_{igeq0}vx^{v-1+v_i} ]

    因为我们是求过导的,现在可以把它还原回去:

    [ln(1-x^v)=-sum_{igeq0}frac{vx^{v+v_i}}{v+vi}=-sum_{igeq1}frac{vx^{vi}}{vi} ]

    因为这里我们只需要算到 (m),所以把系数算出来的时间是调和级数求和(但是相同的物品需要一起算)

    这里有点不懂,为什么只需要算到 m 呢?其实你可以看成是在模 x^{m+1} 意义下的运算,算出来的系数还是对的

    然后多项式 ( t exp) 之后多项式求逆,时间复杂度为 (O(nlog n))

    暂时没有代码,马上补!

  • 相关阅读:
    sqlserver2012——.Net
    sqlserver2012——逻辑运算符
    sqlserver2012——变量declare
    sqlserver2012——EXCEPT差查询
    sqlserver2012——INTERSECT交查询
    sqlserver2012——EXISTS关键字
    Vue3.0-beta
    Next
    Nuxt
    小程序相关
  • 原文地址:https://www.cnblogs.com/C202044zxy/p/14477287.html
Copyright © 2011-2022 走看看