有一个简单的 \(O(n^3)\) DP,考虑 \(f_{x + 1, k} = \sum_{j = 0}^{x} f_{x, k - j}\),利用前缀和优化即可。
考虑这实际上是 \(f_{x + 1}(k) = f_x(k) * \frac {1 - k^{x + 1}}{1 - k}\),于是答案实际上为:
\[[x^k]f(x) = \prod_{i = 1}^n \frac {1 - x^i}{1 - x} \]接下来的方法来自 EI
,大力膜拜,这里稍稍细致展开。
考虑加入哑元 \(t\),也就是看似没有用的一个元:
\[f(t) = \prod_{i = 1}^n \frac {1 - x^i t}{1 - x} \]有一个重要的观察是:
\[f(xt) = \prod_{i = 1}^n \frac {1 - x^{i + 1} t}{1 - x} = f(t) \frac {1 - x^{n + 1} t}{1 - x t} \]因此有 \((1 - xt) f(xt) = (1 - x^{n + 1}t) f(t)\)。
有一个关键的等式:
\[[t^m] f(xt) = x^m [t^m] f(t) \]考虑 \([t^m] f(t)\) 是由某 \(k\) 个 \(x^i t\) 选来,现在每一个 \(t\) 都多来了一个 \(x\),那么自然就多了 \(m\) 个 \(x\),于是得到了上式。
考虑设 \(f_m = [t^m] f(x)\),也就是此时将 \(f\) 看作一个关于 \(t\) 的多项式,而系数 \(f_m\) 实际上一个关于 \(x\) 的多项式。
我们在 \((1 - xt) f(xt) = (1 - x^{n + 1}t) f(t)\) 对两边同时取 \([t^m]\),可以得到:
\[\begin{aligned} \\ [t^m] f(xt) - [t^m] xt f(xt) &= [t^m] f(t) - [t^m] x^{n + 1} t f(t) \\ x^m f_m - x \times x^{m - 1} f_{m- 1} &= f_m - x^{n + 1} f_{m - 1} \\ (x^m - 1) f_m &= (x^{n + 1} - x^m) f_{m - 1} \\ f_m &= -x^m \frac {1 - x^{n - m + 1}}{1 - x^m} f_{m - 1} \end{aligned} \]现在我们考虑如何维护这个函数。
考虑 \(\frac 1 {1 - x^m} = \sum_k x^{km}\),实际上是对于 \(f_{m - 1}\) 做一个间隔为 \(m\) 的前缀和。
考虑 \(1 - x^{n - m + 1}\) 就是 \(f_m(x) \leftarrow f_m(x) - f_m(x - (n - m + 1)\) 即可。
于是考虑 \(g_m = \frac {1 - x^{n - m + 1}}{1 - x^m} g_{m - 1}\),那么
\[f_m = (-1)^m x^{\frac {m \times (m + 1)} 2} g_m \]\(g\) 是好维护的,最终答案为 \(\sum [x^k] f_m = \sum [x^{k - \frac {m(m + 1)}{2}}] (-1)^m g_m\),发现当 \(m \gt \sqrt k\) 的时候就没有值了,所以只需要维护 \(O(\sqrt k)\) 次卷积,每次是 \(O(k)\) 的,非常优秀。
标签:frac,sum,计数,EI,考虑,prod,xt,逆序 From: https://www.cnblogs.com/jeefy/p/17966189