Wise Men[CF1326F]
题目链接
题意
有 $n$ 个人,告诉你这 $n$ 个人互相之间是否认识,然后将这 $n$ 个人排成一列,记为 $p_i$,设 $b_i=[p_{i}\ know \ p_{i+1}]$,对于 $b$ 的 $2^{n-1}$ 种情况,求有多少个排列对应这种情况。
$n\leq 2^{18}$。
题解
这毒瘤数数题谁想得到啊。。
不过这种一般都能想到是容斥。难道真的是要比谁想象力丰富吗qwq
那就容斥吧。设 $f_s$ 表示当 $s$ 的第 $i$ 位为 $1$ 时,$i$ 和 $i+1$ 必须认识,当 $s$ 的第 $i$ 位为 $0$ 时,$i$ 和 $i+1$ 不必须认识。
那么最终的答案就是这个 $f$ 的超集和反演/高维差分。
这样子容斥的好处是,每一段 $1$ 之间的计算就不会受影响了。因为 $0$ 的条件变成了可以随便选。因此我们考虑每一个连续的段分开计算,最后再合并在一起。
而连续的 $k$ 个 $1$ 代表的是 $k+1$ 个点,这些点相邻之间认识,所形成的一条链。
而这些连续段代表的节点个数加起来是 $n$。这显然是一个整数划分的形式,当 $n=18$ 时为 $P_{18}=385$。
也就是说我们实际上只需要考虑 $385$ 种情况即可。
设 $g_s$ 表示对于集合 $s$ 中的点,有多少种排列使得相邻之间认识,这个可以用状压DP算出。
那么对于整数划分 $\sum_{i=1}^kx_i=n$ 而言,答案为 $\sum {|S_i|=x_i}[|\bigcup S_i|=n]\prod{i=1}^k g_{S_i}$。
这就很像WC2018的州区划分了。
设新的 $g_{i,s}=g_s\times [|s|=i]$,去掉其中一个限制。那么答案就是若干个 $g_{x_i}$ 做或卷积后对应位置相乘,然后再逆变换回来后的第 $2^n-1$ 位。
显然 $g_i$ 可以预先FWT好。
可以发现,最后的IFWT只需要求的是其中一位。用子集反演稍微理解一下/死记硬背/找规律可以发现:
$IFWT_A[n]=\sum A_i\times (-1)^{|n\ xor\ i|}$
那么对于一个整数划分 $\sum_{i=1}^kx_i=n$,就可以在 $O((k+1)2^n)$ 的时间内求出答案。
状压DP和预处理 $FWT_{g_i}$ 的时间都是 $O(n^22^n)$ 的。
设 $n$ 的整数划分的个数总和为 $S_n$,则时间复杂度为 $O((S_n+n^2)2^n)$。
当 $n=18$ 时打表可得 $S_{18}=1596$。CF时限4s,不慌不慌。
程序
1 |
|