【总结】不同卷积如何来搞
作者:互联网
【总结】不同卷积如何来搞
md老子又tmd卷积构造错调一天,我来向smy && 高哥学习,总结一下不同的形式如何卷积
- 等号
和为定值
从0到上界全遍历
\[ a_i=\sum_{j=0}^i b_j c_{i-j} \]
最简单的形式,也是最基础的形式\(j\in[l,r]\cap [0,i]\)
此时由于\(j\)有这样的限制,也就是意思是\(b[]\)只有\([l,r]\)有值,令其他b[i]=0即可,没什么难的
差为定值
全遍历
\[ a_i=\sum_{j=i}^n b_{j-i}a_j \]
分别用\(n-i,n-j\)替换\(i,j\)即可
\[ a_{i}=\sum_{n-j=n-i}^n b_{i-j}a_j \]
此时你可以发现\(j+n-i-j=n-i\),符号最前面那种形式。这可以看做是\(i\)位置上的值其实是\(b_{n-i}\),所以具体操作是将std::reverse(b,b+n+1)
,然后卷积到一起之后我们得到的是\(a_{n-i}\)我们记得要std::reverse(a,a+n+1)
,注意这些std::reverse()
的上下界,这些上下界搞错相当于卷积直接就是错的,要引起注意!\(j\in[l,r]\cap [0,i]\)
同理
同余号
道理都是一样的,可以看做是时刻维护长度\(< \mod {}\)的数组。
标签:总结,std,reverse,卷积,sum,cap,定值,如何 来源: https://www.cnblogs.com/winlere/p/12164223.html