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*} ]

    也是树状数组维护即可

  • 相关阅读:
    探讨变量的内存分配方式
    色彩之RGB和灰阶
    Perl语言:qw简写
    【转】位操作
    [转]Perl学习笔记
    Spaghetti code&Ravioli code&Lasagna code&Spaghetti with meatballs
    交叉编译lsusb
    GCC,LLVM,Clang编译器对比
    如何判断自己是否到了该辞职的时候
    Javascript Array和String的互转换。
  • 原文地址:https://www.cnblogs.com/Creed-qwq/p/13850652.html
Copyright © 2011-2022 走看看