自己卷自己的分治 NTT
考虑如下卷积:
仍然可以 cdq 分治计算。
考虑当前在 \([l, r]\),希望计算 \([l, mid]\) 贡献到 \([mid + 1, r]\)。若 \(r - l < l\) 那么 \([1, r - l]\) 都被算出,直接用 \([1, r - l]\) 和 \([l, mid]\) 卷两遍即可;否则 \(l = 1\),\([l, mid]\) 和 \([l, mid]\) 卷一遍即可。
1. [ABC315Ex] Typical Convolution Problem
设 \(g_i = \sum\limits_{j + k \le i} f_j f_k\),那么 \(f, g\) 可以互推,就化成上面的形式了。
2. P4566 [CTSC2018] 青蕈领主
考虑这些极长区间一定形成了树形结构,不然就无解。
对于树上的一个点,设 \(f_n\) 为长度为 \(n + 1\) 的排列,所有连续区间要么长度为 \(1\) 要么包含位置 \(n + 1\) 的方案数。那么答案即为 \(\prod f_{|son_i|}\)。
问题转为计算 \(f_n\)。
若取其逆排列,那么所有连续区间要么长度为 \(1\) 要么包含最大值。
考虑由长度为 \(n - 1\) 推到长度为 \(n\)。
若原来的排列合法,那么最大值插入任意非端点位置即可。所以贡献是 \((n - 1) f_{n - 1}\)。
若原来的排列不合法,那么极长的不包含最大值的段只能有一个,因为最大值的插入只能破坏一个。考虑取极长的不包含最大值的段,设其段长为 \(i\)。那么最大值肯定是插入其中 \(i - 1\) 个空隙;把这一段视为整体,和其他 \(n - i\) 个元素构成的段也要合法。所以贡献是 \((i - 1) f_i f_{n - i}\)。
这样我们得到了递推式:\(f_i = (i - 1) f_{i - 1} + \sum\limits_{j = 2}^{n - 2} (j - 1) f_j f_{i - j}\)。
即:\(f_i = (3 - i) f_{i - 1} + \sum\limits_{j = 1}^{n - 1} (j - 1) f_j f_{i - j}\)。
就可以直接计算了。