原创 动态卷积

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

也是树状数组维护即可

原文地址:https://www.cnblogs.com/Creed-qwq/p/13850652.html