JZOJ 5135. 【NOI2017模拟6.4】逆序对
求逆序对为\(k\)的长度为\(n\)的排列的数量 \(n, k \le 10^5\)
另\(f_{n, k}\)表示长度为\(n\)且逆序对为\(k\)的排列数量
显然有$$f_{n, k} = \sum_{i = 0}^{min(n - 1, k)} f_{n - 1, k - i}$$
这东西暴力DP是\(O(n^2)\)的
把它扔进生成函数里~另\(F_n = \sum_{i = 0}f_{n, i} x^i \)
那么就有\(F_n = F_{n - 1}\sum_{i = 0}^{n - 1}x^i = F_{n - 1} \cdot \frac{1 - x^n}{1 - x} \)
$$F_n = \frac{\prod_{i = 1}^{n} (1 - x^i)}{(1 - x)^n}$$
答案就是\([x^k]F_n\)
考虑到\([x^i]\frac{1}{(1 - x)^n} = \binom{i + n - 1}{i} \),于是只需要求\(\prod_{i = 1}^{n} (1 - x^i)\)的前\(k + 1\)项系数即可~
这可以看成一个背包问题,对于包含\(x\)的项,最多只能取\(O(\sqrt{k})\)项
于是另\(g_{i, j}\)表示用了\(i\)个物品,\(x\)的幂次为\(j\)的权值
于是有如下转移
$$g_{i, j} = -g_{i - 1, j - 1} + g_{i, j - i} + g_{i - 1, j - (n + 1)}$$
这个DP的意思是,每加入\(1\)个数,需要将之前加入的所有数都加\(1\) (用来保证选的数不重复)。然后也可以不加入数,整体加\(1\)。最后减去最大数为\(n + 1\)的情况
时间复杂度\(O(n \sqrt{n} )\)