题面

链接

有 $2N$ 个人每个人有一个高度 $h_i$

要求两两配对满足

  1. 每个人只能配对一次
  2. 每对俩人高度不同

问方案数

思路

易得

记 $ff[s]$ 为至少有 $s$ 对人高度相同情况下的方案数(就是容斥原理)

$ans=\sum\limits_{s=0}^{n}{(-1)^{s}\times ff[s]}$

记 $fff[x]$ 为 $2x$ 个人任意配对的方案数

$fff[x]=fff[x-1]\times(2x-1)$

新加入两个可以配对也可以选择和前面的任意一人组合

然而容斥只想到 $2^n$ 做法(暴力枚举全部情况)

$O(n^2)$ dp

记 $dp[i][j]$ 为 $[1, i]$ 高度的人配对后剩下 $j$ 人未配对的方案数

初始条件 $dp[0][0]=1$

记高度 $i$ 的人一共有 $t[i]$ 个

枚举这 $t[i]$ 个人中有 $j$ 个人和之前的配对了,剩下 $t[i]-j$ 人未配对

转移方程 $dp[i][k] = \sum{C_{t[i]}^{j}\times A_{k+j-(t[i]-j)}^{j}\times dp[i-1][k+j-(t[i]-j)]}$

这是以我的水平能想到的最快的算法了呜呜

分治NTT

这你能信,上面那个容斥可以用分治NTT做出来

考虑当前的高度 $i$ 有 $t[i]$ 个人

那么当前高度对 $s$ 的大小贡献为 $x$ 时,方案数是 $C_{t[i]}^{2x}\times fff[x]$

求 $ff[]$ 其实就是把每个高度的贡献数组 NTT 起来,暴力 NTT 的话是 $O(n^2\log n)$

于是采用分治 NTT ,但是这个分治好像和我在洛谷上板子题不大一样呜呜

分治不是按照 $ff[]$ 数组的下标分治, 而是按照高度分治

先分别求出 $[l,mid],[mid+1,r]$ 高度的 NTT 乘积,再把两者卷积

$\sum\limits_{所有高度}t[i]=N$

因为分治,每个高度的贡献最多被卷 $\log n$ 次

总的复杂度是 $O(n\log^2 n)$ 妙啊

需要注意的就是在算答案的时候当 $s$ 大小为 $x$ 时还要乘上 $fff[n−x]$,因为还有 $n−x$ 组没有分配完

代码

dp代码

正解代码

参考资料

写这篇博客时官方题解并未发布,且百度上只有一篇题解