zoukankan      html  css  js  c++  java
  • 原创 动态卷积

    Pro:
    给定数组(f_x)
    (g_n=C(n+k,k))
    要求动态维护f和g的卷积h
    支持以下操作
    1.修改f的某一项
    2.查询h的某一项

    [\ ]

    k为常数且<=20,n,m<=100000
    Sol:

    [egin{align*} ans&=sum_{i=1}^n f_i * C(n-i+k,k)\ &=sum_{i=1}^n f_i * sum_{j=0}^k*C(-i,j)*C(n+k,k-j) (广义的组合恒等式?)\ &=sum_{j=0}^k C(n+k,k-j) sum_{i=1}^n f_i*C(-i,j)\ &这里 n<0时 C(n,m)=frac{n*(n-1)*...*(n-m+1)}{m!}=(-1)^m*C(|n|+m-1,m) end{align*} ]

    因此只需要用k个树状数组去维护最后那个式子的前缀和即可

    Sol:
    由这个题,我们可以衍生出这样一个关于组合数的恒等式

    [egin{align*} &C(n,m)=sum_{i=0}^m C(n+k,m-i)*C(k+i-1,i)*(-1)^i\ &k为>=1的常数 end{align*} ]

    学校里的学长给了另一个更为自然的做法

    [egin{align*} ans&=sum_{i=1}^n f_{n-i}*C(i+k,k)\ &=frac{1}{k!}sum_{i=1}^n f_{n-i}*(i+1)^{overline{k}}\ &=frac{1}{k!}sum_{i=1}^n f_{n-i}*sum_{j=0}^k S[k,j]*(i+1)^j\ &=frac{1}{k!}sum_{j=0}^k S[k,j]*sum_{i=1}^n f_{n-i}*(i+1)^j\ &=frac{1}{k!}sum_{j=0}^k S[k,j]*sum_{i=1}^n f_{i}*(n+1-i)^j\ &=frac{1}{k!}sum_{j=0}^k S[k,j]*sum_{i=1}^n f_{i}*sum_{t=1}^j C(j,t)*(-i)^t*(n+1)^{j-t}\ &=frac{1}{k!}sum_{j=0}^k S[k,j]*sum_{t=1}^j C(j,t)*(n+1)^{j-t} sum_{i=1}^n f_{i}*(-i)^t\ end{align*} ]

    也是树状数组维护即可

  • 相关阅读:
    bazel-编译静态库
    bazel-demo2_1
    160个creakme(八)
    适合新手的160个creakme(四)
    熊猫烧香病毒逆向分析
    适合新手的160个creakme(三)
    适合新手的160个creakme(二)
    适合新手的160个creakme(一)
    shell脚本练习题
    Core dump文件和ECFS
  • 原文地址:https://www.cnblogs.com/Creed-qwq/p/13850652.html
Copyright © 2011-2022 走看看