题目大意
求长度为 $n$、逆序对数量为 $k$ 的排列的数量。
$n, k \le 10^5$
【50%】n, k<=1000
设 $f[i][j]$ 表示长度为 $i$、逆序对数量为 $j$ 的方案数。
$f[i][j]=\sum_{now=0}^{i-1} f[i-1][j-now]$
【100%解法1】
考虑每个元素的贡献(该元素前面有多少个比它大),可以得到一个贡献序列 $B$。其中该序列满足 $0<=B[i]<=i-1$,且 $\sum B[i]=k$。
该序列与原序列唯一对应,所以我们要求有多少不同的 $B$ 序列。
考虑 $B[i]$ 的生成函数: $1+x+x^2+…+x^{i-1}=\frac{1-x^i}{1-x}$,因此最后和为 $k$ 的方案数就是 $\prod_{i=1}^n \frac{1-x^i}{1-x}$ 的 $x^k$ 的系数。
来一个不清真的做法。
设 $F(x)=\prod_{i=1}^n \frac{1-x^i}{1-x}$,则
用调和级数那样 $O(k~log~k)$ 处理 $ln~F(x)$,FFT 算 $e^{ln~F(x)}$
以上抄自 WerKeyTom_FTD 给的笔记,我还没学会
【100%解法2】
来一个清真的做法。
所以现在分成前面和后面两个部分,最后枚举前面是 $x^i$,后面就是 $x^{k-i}$,把对应系数乘起来即可。后面的系数是普通组合数,所以目标变成算前面的系数。
前面部分可以看成:有 $n$ 个物品,第 $i$ 个物品大小为 $i$,且选了 $x$ 个物品的话方案数要乘上 $(-1)^x$,求大小为 $k$ 的方案数。
这就是个经典 dp。设 $f[i][j]$ 表示用 $i$ 个互不相同的物品、和为 $j$ 的方案数。我们限定这 $i$ 个物品是有序(从小到大)的。
转移有两种操作:一种是全体体积加 $1$,一种是新加一个大小为 $1$ 的物品。(注意新加一个物品的时候,$-1$ 的指数会变,所以这时候算方案数是 $f[i][j]-=…$。)
这样垒上去可能会使某些物品大小超过 $n$,所以当某个物品超限的时候要及时减去,即 $f[i][j]+=f[i-1][j-(n+1)]$。(注意这里 $-1$ 的指数又变了,所以是加等于。)
然后会发现物品最多只需要 $\sqrt k$ 个,所以复杂度是 $O(k \sqrt k)$
代码
//解法2
1 |
|