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*}
]
也是树状数组维护即可