【总结】不同卷积如何来搞

【总结】不同卷积如何来搞

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 {}\)的数组。

    扫描二维码关注公众号,回复: 8454080 查看本文章

猜你喜欢

转载自www.cnblogs.com/winlere/p/12164223.html