CF1326F
给定一张无向图 G,大小为 (n)。
求有多少种排列 (p),其生成 01 串 S 为:
- 对于 (1le ile n-1),若 (p_i) 与 (p_{i+1}) 如果其在图 G 上存在边,则第 (S_i=1),否则为 (0)
对于所有可能的 (2^{n-1}) 种 01 串求有多少种序列可以生成它。
对于 F1,(nle 14)
对于 F2,(nle 18)
( m Sol:)
for F1
考虑暴力搜索,枚举 (inom{7}{14}) 种选入集合 (1) 的方案数,然后枚举长度为 (2^7) 的 01 串,与另一边的 01 串,同时枚举结尾和开头。
问题来了我们不知道某个集合得到某个 01 串的方案数。
不过这两个问题好像是独立的,另一个问题单独用一个状压dp算即可,即 (f_{S,T,i}) 表示被选出来的数有 S 个,当前的 01 串为 T,且结尾为 (t) 的方案数。这里的复杂度约为 (O(2^{13} imes 2^7 imes 7))
而前面部分的复杂为 (O(7^2 imes inom{14}{7} imes 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 imes (n^2+1597)))