有趣的推式子题
前段时间在 u 群看见的问题。
问题:求有多少长为 \(n\),每个元素在 \(1 \sim m\) 之间,且逆序对为偶数的序列个数。模数不重要,\(n, m \le 10^9\)。
首先经典套路是给求出 偶数+奇数 和 偶数-奇数 。最后偶数就是两个部分的和除以二。偶数+奇数 显然就是每个排列都合法,于是就是 \(m^n\)。
偶数-奇数 就相当于给每个逆序对 \(-1\) 的贡献,然后算所有序列的权值和。
首先一个关于 \(\text{poly}(n, m)\) 的做法是重要的。如果直接枚举序列最后一个元素是什么,那么就要记录 \(1 \sim m\) 每个元素出现次数的奇偶性,复杂度指数。
注意到一般排列的 dp 很多都可以枚举最后一个元素(在前面的排名)是什么,因为排列保证了每个元素互不相同,于是最后一个元素排名确定,有多少元素小于它就已经确定,而这题不行。
而逆序对是 \((i, a_i)\) 和 \((j, a_j)\) 的比较,由于下标 \(i\) 肯定不相同,而 \(a\) 可能相同,那么显然顺着 \(a\) 的大小去比较下标在这题肯定比顺着原序列扫比较 \(a\) 舒服。
于是设 \(f_{i, j}\) 表示每个元素在 \(1 \sim i\) 之间,序列长度为 \(j\) 的所有序列权值和。转移最暴力都是枚举 \(f_{i, j}\),然后再安排个 dp 把元素等于 \(i + 1\) 的插进这长为 \(j\) 的序列,不管复杂度多高反正已经 \(\text{poly}(n, m)\) 了。
但 \(n, m \le 10^9\),所以 dp 复杂度肯定炸。观察一下 \(f_{i, j}\) 的转移式,相当于往 \(j + 1\) 个空隙之间插数。由于每个逆序对有 \(-1\) 的贡献,倒数 \(1, 3, 5, \cdots\) 的位置插数逆序对数增加偶数,贡献为 \(1\),于是在某一个空隙之间插入数的生成函数(插一个数就是一个 \(x\),插 \(k\) 个就是 \(x^k\))就是 \(\sum x^i = \frac{1}{1 - x}\),同理,倒数 \(2, 4, 6, \cdots\) 之间插逆序对数加奇数,所以一个空隙里面插数的就是 \(\sum (-x)^i = \frac{1}{1 + x}\)。
所以 \(f_{i, j}\) 之间插若干 \(i + 1\) 的生成函数就是 \((\frac{1}{1 - x})^{\lceil \frac{j + 1}{2} \rceil}(\frac{1}{1 + x})^{\lfloor \frac{j + 1}{2} \rfloor}\)(这个生成函数的 \(k\) 次项就是向里面插 \(k\) 个 \(i + 1\) 的权值和)。
根据平方差公式 \((1 - x)(1 + x) = 1 - x^2\) 得到上式为 \((\frac{1}{1 - x^2})^{\lceil \frac{j}{2} \rceil}(\frac{1}{1 - x})^{[j \equiv 0 \pmod{2}]}\)。
一个简单但是重要的观察:当 \(j\) 是奇数时,上式只有 \((\frac{1}{1 - x^2})^{\lceil \frac{j}{2} \rceil}\),生成函数没有奇数项,也就是说 \(f_{i, j}\) 所有插奇数个数的方案,其权值和相互抵消变成了 \(0\),于是其只能贡献到第二维与 \(j\) 同奇偶性的位置,也就是 \(j\) 只能贡献到奇数。又 \(j\) 是奇数,所以奇数只能贡献到奇数,而偶数都可以贡献。
又由于初始只有 \(f_{0, 0} = 1\),第二维是偶数。将贡献看成每一步行走到新的 \(f_{i, j}\),答案就是 \(f_{m, n}\),也就是说从 \(f_{0, 0}\) 走到 \(f_{m, n}\) 所有方案的权值和。
由于第二维奇数只能转移到奇数,那么如果 \(n\) 是偶数,第二维一定一直是偶数(不然变成奇数就回不到偶数了),如果 \(n\) 是奇数,那么第二维一定先是偶数然后在变成奇数。
那么先考虑 \(n\) 是偶数的情况:由于第二维 \(j\) 永远是偶数,那么之前的转移 \((\frac{1}{1 - x^2})^{\lceil \frac{j}{2} \rceil}(\frac{1}{1 - x})^{[j \equiv 0 \pmod{2}]}\) 中,后面那个 \(\frac{1}{1 - x}\) 也只能选偶数项,所以也可以改成 \(\frac{1}{1 - x^2}\),原式就变成了 \((\frac{1}{1 - x^2})^{\frac{j}{2} + 1}\)。
由于所有东西都是偶数,不妨给所有东西都除以 \(2\),也就是说 \(x^2 \to x, j \to \frac{j}{2}\)。
那么现在就变成了 \(f_{m, \frac{n}{2}}\)。我们设从 \((0, 0)\) 走到 \((m, \frac{n}{2})\) 的过程中,第 \(i\) 行经过的是第 \(a_i\) 列,也就是说路径是 \((0, a_0) \to (1, a_1), \to (2, a_2) \to \cdots \to (m, a_m)(0 = a_0 \le a_1 \le a_2 \le \cdots \le a_m = \frac{n}{2})\)。这样一条路径,其贡献就是把相邻两个 \((i, a_i)\) 之间的贡献乘起来。那 \((i, a_i)\) 走到 \((i + 1, a_{i + 1})\) 的贡献就是多加了 \(a_{i + 1} - a_i\) 个 \(x\)(原来的 \(x^2\))的方案数,生成函数就是 \([x^{a_{i + 1} - a_i}] (\frac{1}{1 - x})^{a_i + 1}\),值就是 \(\binom{a_{i + 1}}{a_i}\)。
于是现在要对于所有 \((a_0, a_1, \cdots a_m)\) 求出 \(\binom{a_m = \frac{n}{2}}{a_{m - 1}} \cdots \binom{a_1}{a_0 = 0}\),这个的组合意义就是:在 \(a_m = \frac{n}{2}\) 个中选 \(a_{m - 1}\) 个保留到 \(m - 1\) 之前,其它 \(a_m - a_{m - 1}\) 留在 \(m\) 这一层,不妨将这些球颜色染成 \(m\)。之后依次按这种方法将剩下的球染成 \(m - 1, m - 2, \cdots, 1\)。所以每个球都会有一个 \(1 \sim m\) 之间的颜色。由于可以任意钦定 \((a_0, a_1, \cdots, a_m)\),那么每种颜色球的个数无所谓,位置也无所谓,就相当于这些球任意染色,那么总方案自然就是 \(m^{\frac{n}{2}}\)。
\(n\) 是奇数是几乎一样的,经过一些分析就是 \(m^{\frac{n + 1}{2}}\)。
最终答案也就是 \(\frac{m^n + m^{\lceil \frac{n}{2} \rceil}}{2}\)。