CF1326F

CF1326F

给定一张无向图 G,大小为 \(n\)

求有多少种排列 \(p\),其生成 01 串 S 为:

  • 对于 \(1\le i\le n-1\),若 \(p_i\)\(p_{i+1}\) 如果其在图 G 上存在边,则第 \(S_i=1\),否则为 \(0\)

对于所有可能的 \(2^{n-1}\) 种 01 串求有多少种序列可以生成它。

对于 F1,\(n\le 14\)

对于 F2,\(n\le 18\)

\(\rm Sol:\)

for F1

考虑暴力搜索,枚举 \(\binom{7}{14}\) 种选入集合 \(1\) 的方案数,然后枚举长度为 \(2^7\) 的 01 串,与另一边的 01 串,同时枚举结尾和开头。

问题来了我们不知道某个集合得到某个 01 串的方案数。

不过这两个问题好像是独立的,另一个问题单独用一个状压dp算即可,即 \(f_{S,T,i}\) 表示被选出来的数有 S 个,当前的 01 串为 T,且结尾为 \(t\) 的方案数。这里的复杂度约为 \(O(2^{13}\times 2^7\times 7)\)

而前面部分的复杂为 \(O(7^2\times \binom{14}{7}\times 2^{14})\)

然后居然可以过。。。

for F2

\(01\) 关系进行容斥,对于 \(01\)\(S\) 只需要计算计算在每个 \(1\) 位置上恰好有边的数量,那么再进行一个高维差分就是答案了。

这样处理的好处是不需要关注具体的 01,每一段 01 当作是一条独立的链,那么接下来只需要对于拆分数考虑即可,这个是极小的,仅为 \(385\)

对于每个拆分数考虑,只需要知道若干条链,大小依次为 \(1,1,2,2,...\) 最后凑成全集的方案数,先预处理 \(f_{S}\) 表示状态为 S 的 \(f\) 数组对应的方案数,然后注意到大小和为 \(n\),对于每次填入的数考虑记 \(F_{cnt}(x)\) 表示所有大小为 \(cnt\)\(f\) 数组构成的集合幂级数,那么显然 \(F(x)\) 依次的或卷积就是答案了。

只需要预处理 \(f\),设 \(g_{i,S}\) 表示结尾为 \(i\),当前 S 已经走过的方案数,这一部分复杂度为 \(\mathcal O(n^22^n)\)

另一边,事实上 FWT 可以边枚举拆分数边转移,有效的转移数通过打表仅为 \(1597\),但是对于结果需要做 IFWT,不过注意到只需要 IFWT\((x^{U})\),那么直接暴力做 IFWT 即可。

复杂度是 \(\mathcal O(2^n\times (n^2+1597))\)

posted @ 2020-09-11 19:52  Soulist  阅读(136)  评论(0)    收藏  举报