zoukankan      html  css  js  c++  java
  • 洛谷 P4708 画画(无标号欧拉子图计数)

    首先还是类似于无标号无向图计数那样,考虑点的置换带动边的置换,一定构成单射,根据 Burnside 引理:

    \[|X / G| = \frac{1}{|G|}\sum\limits_{g \in G} |X ^ g| \]

    于是我们只需要考虑每个(点)置换下边置换的不动点(要求使得每个点度数为偶数)即可,有如下观察:

    • 对于两个点循环置换 \(C_1, C_2\) 边在 \(C_1\) 导出子图中的边依然置换到导出子图内,对于其他循环置换同理;对于 \(C_1, C_2\) 之间的边,置换后任然在 \(C_1, C_2\) 之间。

    于是本质上所有边循环置换就分为点循环置换内部和点循环置换之间,下面分情况考虑。

    对于点循环置换 \(C\) 内部的情况,我们发现当且仅当 \(2 \mid |C|\) 时存在一个边循环置换恰好让所有点度数 \(+1\),剩下 \(\frac{|C|}{2} - 1\) 个边循环置换会让 \(|C|\) 所有点度数恰好 \(+2\),这部分可以任选。

    而对于剩下恰好那一个将所有 \(C\) 内点奇偶性改变的边循环置换我们先放着最后考虑。

    而对于奇数大小的点循环置换,发现其所有边循环置换都将所有点度数恰好 \(+2\),因此这些边可以任意选。

    所以这部分对一个点循环置换提供了:\(\sum\limits_{i = 1} ^ k \lfloor \frac{a_i - 1}{2} \rfloor\) 个可以任选的边循环置换,注意 对于所有大小为偶数的点循环置换,还保留了一个能改变其整环奇偶性的边循环置换。

    接下来考虑两个循环置换 \(C_1, C_2\) 之间的边循环置换,发现 \(C_1, C_2\) 之间有 \(\frac{|C_1||C_2|}{\mathrm{lcm}(|C_1|, |C_2|)} = (|C_1|, |C_2|)\) 个边循环置换,没个边循环置换让 \(C_1\) 上所有点度数加上 \(\frac{|C_2|}{(|C_1|, |C_2|)}\),让 \(C_2\) 上所有点度数加上 \(\frac{|C_1|}{(|C_1|, |C_2|)}\).

    \(|C_1|, |C_2|\) 一奇一偶,不妨设 \(2 \nmid |C_1|, 2 \mid |C_2|\) 则选择一个两者之间的边循环置换,\(C_1\) 上的点全部加上偶数度数,\(C_2\) 上的点全部加上奇数度数,换而言之 选择一奇一偶之间的边循环置换对奇数大小的点循环置换度数奇偶性没有影响。

    注意到我们之前给每个偶数大小的点循环置换保留了一个能改变整体奇偶性的边循环置换,且发现所有边循环置换对奇偶性的影响都是整个点循环置换的,因此对于奇偶点循环置换或偶偶点循环置换之间的所有边循环置换可以任选或不选,最后的奇偶性由保留的内部边循环置换唯一确定且可以保证。

    所以这部分对边循环置换的个数贡献就是奇偶,偶偶点循环置换之间大小的 \(\gcd\),并且原本保留的边循环置换也不需要考虑,下面只需要考虑奇奇点循环置换之间的边即可。

    \(2 \nmid |C_1|, 2 \nmid |C_2|\) 则每选一个两者之间的边循环置换都会使得两者整体度数奇偶性改变。

    那么问题可以转化为:给定一个大小为 \(n\) 的无向完全图(两点之间可能有多条边但至少有一条边),保留一些边使得其每个点度数为偶数。

    这是一个经典问题,将所有点看作是二进制下的位,那么一条边就相当于这两位为 \(1\) 的数,问题就是有多少个异或和为 \(0\) 的子集。

    考虑找出这所有数的线性基,在原本的组合意义上就是无向完全图的任何一颗生成树。

    注意到无论怎么选点集,所有位上数字的异或和总是为 \(0\) 的,也就是说线性基外的元素不论怎么选,线性基内都恰好可以找出唯一的与之对应的子集使得整体异或和为 \(0\).

    那么因此这部分的贡献为:\(\sum\limits_{i < j, 2 \nmid |C_i|, 2 \nmid |C_j|}(|C_i|, |C_j|) - (\sum\limits_{i = 1} ^ k [2 \nmid |C_i|] - [\exists 1 \le i \le k, 2 \nmid |C_i|])\),最终合起来贡献为:

    \[\sum\limits_{i = 1} ^ k \lfloor \frac{a_i - 1}{2} \rfloor + \sum\limits_{i < j}(a_i, a_j) - (\sum\limits_{i = 1} ^ k [2 \nmid a_i] - [\exists 1 \le i \le k, 2 \nmid a_i]) \]

    其中 \(a\) 为点循环置换的大小序列,注意到数据范围较小,可以直接枚举所有划分数。

    运用无标号无向图搜索的方法和精细实现,复杂度可以做到接近划分数数量,下面这份代码可以在 \(2s\) 内跑出 \(90\).

    代码

  • 相关阅读:
    Linux下Git远程仓库的使用详解
    Git单人本地仓库操作
    分布式版本控制系统之Git
    搭建Redis集群
    搭建 Redis 的主从
    Redis与Python进行交互
    Redis的数据类型以及各类型的操作
    Redis服务端和客户端的命令
    配置Redis
    Linux下Redis的安装
  • 原文地址:https://www.cnblogs.com/Go7338395/p/15690995.html
Copyright © 2011-2022 走看看