Q7.5.4.1. 卷积递推 题解
链接
从 \([2,10^5]\) 开始分治。如果当前我们要算 \(f_l\sim f_r\):
当 \(l=r\) 时,我们已经到达了分治的叶子节点,只需要把单独的那个式子加上即可,把 \(f_l\) 加上 \((l-1)f_{l-1}\)。
否则,我们递归 \([l,mid]\),然后我们看 \(f(l\sim mid)\) 对 \(f(mid+1\sim r)\) 的贡献。比如:
显然 \(f(5\sim 7)\) 对 \(f(8)\) 的贡献是
所以 \(f(l\sim r)\) 对 \(f(i)\) 的贡献是:
我们设 \(g(i)=f(i)\times (i-1)\),于是原式子:
因为 \(j\in[l,mid]\),\(i\in[mid+1,r]\),故 \(i-j\in[1,r-l+1]\)
现在把它变成序列卷积的形式:
对 \(f(i)\) 的贡献相当于
发现这个式子有的地方从 \(l\) 开始,我们可以把这类下标都减去 \(l\):
\(f(0\sim mid-l)*g(1\sim r-l+1))[i-l]+f(1\sim r-l+1)*g(0\sim mid-l))[i-l]\)
NTT 卷积即可。
但我们发现 \(l=2\) 时会有问题:
\(f(2\sim 4)\) 对 \(f(5)\) 的贡献是 \(f(1)\times f(4)\times 3+f(2)\times f(3)\times 2+f(3)\times f(2)\times 1+f(4)\times f(1)\times 0\)。
发现这等价于 \((f(l\sim mid)*g(1\sim mid))[i]\) 不同于上面,我们这不用再加一团了!原来对于所有 \(j\in [l,mid]\),都满足 \(\forall i\in[mid+1,r],(i-j)\in[l,mid]\)(即要卷积的每一项都在 \([l,mid]\) 中),当且仅当 \(l=2\) 时成立,因为 \((i-j)_\max=r-l\ge 2\)。
故这种情况特判即可。

浙公网安备 33010602011771号