题目链接
【Codeforces 908H】 New year and Boolean Bridges
做法
发现 $ f(u, v)~OR~f(v, u) $ 满足当且仅当 $ f(u, v)~AND~f(v, u) $ 和 $ f(u, v)~XOR~f(v, u) $ 满足,故 $ f(u, v)~OR~f(v, u) $ 不予考虑。
若 $ f(u, v)~AND~f(v, u) $ 满足,则 $ u, v $ 在同一联通块;若 $ f(u, v)~XOR~f(v, u) $ 满足,则 $ u, v $ 不在同一联通块,所以可能产生矛盾,需要判无解。
最后的图一定是个弱连通块,即至少有 $ n - 1 $ 条边,由于一个大小为 $ 1 $ 的独立点对答案贡献为 $ 1 $ ,所以我们要最小化大小 $ \geq 2 $ 的连通块数目,而这样的连通块数目最多有 $ m = \lfloor \frac{ n }{ 2 } \rfloor = 23 $ 个。
考虑状压。令 $ fb[i] $ 表示 $ i $ 号点不能与那些点作为一个强连通块, $ le[i] $ 表示选择状态为 $ i $ 的点作为一个强联通块的合法性,可以通过 $ lowbit $ 从 $ fb[i] $ 推出 $ le[i] $ 。
每新加入一条边,弱连通块合法性满足 $ F[i] = \sum_{ j | k = i }{ F’[j] \times le[k] } $ , $ F’[j] $ 表示上一次操作的 $ F[j] $ 。
这样可以 $ FWT $ 优化,最多进行 $ m $ 次,时间复杂度 $ O(m^2 2^{m}) $ ,并不能过去。
考虑我们 $ FWT $ 后不需要 $ IFWT $ 回去,每次求单点系数。 $ FWT $ 的过程可以理解为一个行向量右乘一个矩阵得到新的行向量,这个矩阵就是我们想要的系数,可以证明:
mu[x][y] = (x & y) != x ? 0 : ksm(-1, popcount(ksm(x, y));
1 |
|