Q7.5.4.1. 卷积递推 题解

链接

\[f_{0} = 1,f_{1} = 2,f_{n} = \left( n - 1 \right)f_{n - 1} + \sum_{i = 2}^{n - 2}{\left( i - 1 \right)f_{i}f_{n - i}}\left( n \geq 2 \right) \]

\([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)\text{ }f(6)\text{ }f(7)|f(8)\text{ }f(9)\text{ }f(10) \]

显然 \(f(5\sim 7)\)\(f(8)\) 的贡献是

\[f(7)\times f(1)\times 0+f(6)\times f(2)\times 1+f(5)\times f(3)\times 2 \]

\[+f(3)\times f(5)\times 4+f(2)\times f(6)\times 5+f(1)\times f(7)\times 6 \]

所以 \(f(l\sim r)\)\(f(i)\) 的贡献是:

\[\sum_{j\in[l,mid]}f(j)\times f(i-j)\times (i-j-1)+\sum_{j\in[l,mid]}f(i-j)\times f(j)\times (j-1) \]

我们设 \(g(i)=f(i)\times (i-1)\),于是原式子:

\[\sum_{j\in[l,mid]}f(j)\times g(i-j)+\sum_{j\in[l,mid]}f(i-j)\times g(j) \]

因为 \(j\in[l,mid]\)\(i\in[mid+1,r]\),故 \(i-j\in[1,r-l+1]\)

现在把它变成序列卷积的形式:

\(f(i)\) 的贡献相当于

\[f(l\sim mid)*g(1\sim r-l+1))[i]+f(1\sim r-l+1)*g(l\sim mid))[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)\text{ }f(3)\text{ }f(4)|f(5)\text{ }f(6)\text{ }f(7) \]

\(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\)

故这种情况特判即可。

posted @ 2024-01-16 17:31  include_c  阅读(36)  评论(0)    收藏  举报