[BZOJ 4671]异或图
Description
给定 \(s\) 个结点数相同且为 \(n\) 的图 \(G_1\sim G_s\) ,设 \(S = \{G_1, G_2,\cdots , G_s\}\) ,问 \(S\) 有多少个子集的异或为一个连通图。
\(1\leq n\leq 10,1\leq s\leq 60\)
Solution
不妨记 \(f_x\) 为连通块个数至少为 \(x\) 的方案数, \(g_x\) 为连通块恰好为 \(x\) 的方案数。
容易得到:
\[f_x=\sum_{i=x}^n\begin{Bmatrix}i\\x\end{Bmatrix}g_i\]
其中第二类斯特林数的含义是将 \(i\) 个连通块塞成 \(x\) 个的方案数。至于为什么要塞成 \(x\) 个,这和 \(f\) 的计算方式有关,之后会提到。
那么由斯特林反演
\[g_x=\sum_{i=x}^n(-1)^{i-x}\begin{bmatrix}i\\x\end{bmatrix}f_i\]
那么
\[\begin{aligned}g_1&=\sum_{i=1}^n(-1)^{i-1}\begin{bmatrix}i\\1\end{bmatrix}f_i\\&=\sum_{i=1}^n(-1)^{i-1}(i-1)!f_i\end{aligned}\]
考虑如何求 \(f\) ,我们可以去枚举子集划分,对于横跨两个集合的边,我们必须让他们异或为 \(0\) ,集合内的边可以随意连,我们不用管(这样可能会导致集合内不连通,这就是上面第二类斯特林数的含义)。
这样我们可以用 \(O(bell(n))\) 的时间枚举子集划分。然后对于每一个划分,用线性基找出边集的极大线性无关组个数,记为 \(tot\) ,那么在当前集合划分下方案为 \(2^{s-tot}\) 。
总复杂度 \(O(bell(n)s\frac{n(n-1)}{2})\) 。
Code
#include <bits/stdc++.h>
#define ll long long
using namespace std;
char ch[120];
ll t, x, bin[64], fac[64], ans, base[64], mp[64];
int s, n, belong[64];
void cal(int sz) {
t = 0; int cnt = 0;
for (int i = 0; i < 64; i++) base[i] = 0;
for (int i = 1, l = -1; i <= n; i++)
for (int j = i+1; j <= n; j++)
t |= bin[++l]*(belong[i] != belong[j]);
for (int j = 1; j <= s; j++) {
x = t&mp[j];
for (int i = 63; i >= 0; i--)
if (x&bin[i]) {
if (!base[i]) {base[i] = x; ++cnt; break; }
else x ^= base[i];
}
}
if (sz&1) ans += fac[sz-1]*bin[s-cnt];
else ans -= fac[sz-1]*bin[s-cnt];
}
void dfs(int x, int sz) {
if (x > n) {cal(sz); return; }
for (int i = 1; i <= sz+1; i++)
belong[x] = i, dfs(x+1, sz+(i == sz+1));
}
void work() {
scanf("%d", &s); bin[0] = fac[0] = 1;
for (int i = 1; i <= 10; i++) fac[i] = 1ll*fac[i-1]*i;
for (int i = 1; i < 64; i++) bin[i] = bin[i-1]<<1;
scanf("%s", ch+1);
for (int len = strlen(ch+1); n*(n-1)/2 < len; ++n);
for (int i = 1, t = 0; i <= n; i++)
for (int j = i+1; j <= n; j++)
if (ch[++t] == '1') mp[1] |= bin[t-1];
for (int T = 2; T <= s; T++) {
scanf("%s", ch+1);
for (int i = 1, t = 0; i <= n; i++)
for (int j = i+1; j <= n; j++)
if (ch[++t] == '1') mp[T] |= bin[t-1];
}
dfs(1, 0); printf("%lld\n", ans);
}
int main() {work(); return 0; }
[BZOJ 4671]异或图的更多相关文章
- BZOJ 4671 异或图 | 线性基 容斥 DFS
题面 Description 定义两个结点数相同的图 G1 与图 G2 的异或为一个新的图 G, 其中如果 (u, v) 在 G1 与 G2 中的出现次数之和为 1, 那么边 (u, v) 在 G 中 ...
- bzoj 4671 异或图——容斥+斯特林反演+线性基
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=4671 考虑计算不是连通图的方案,乘上容斥系数来进行容斥. 可以枚举子集划分(复杂度是O(Be ...
- bzoj 4671 异或图 —— 容斥+斯特林反演+线性基
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=4671 首先,考虑容斥,就是设 \( t[i] \) 表示至少有 \( i \) 个连通块的方 ...
- 【BZOJ】4671: 异或图
题解 写完之后开始TTTTTTT--懵逼 这道题我们考虑一个东西叫容斥系数啊>< 这个是什么东西呢 也就是\(\sum_{i = 1}^{m}\binom{m}{i}f_{i} = [m ...
- 【BZOJ4671】异或图(斯特林反演)
[BZOJ4671]异或图(斯特林反演) 题面 BZOJ Description 定义两个结点数相同的图 G1 与图 G2 的异或为一个新的图 G, 其中如果 (u, v) 在 G1 与 G2 中的出 ...
- bzoj4671 异或图(斯特林反演,线性基)
bzoj4671 异或图(斯特林反演,线性基) 祭奠天国的bzoj. 题解时间 首先考虑类似于容斥的东西. 设 $ f_{ i } $ 为至少有 $ i $ 个连通块的方案数, $ g_{ i } $ ...
- bzoj4671: 异或图——斯特林反演
[BZOJ4671]异或图 - xjr01 - 博客园 考虑先算一些限制少的情况 gi表示把n个点的图,划分成i个连通块的方案数 连通块之间不连通很好处理(怎么处理看下边),但是内部必须连通,就很难办 ...
- 【XSY2701】异或图 线性基 容斥原理
题目描述 定义两个图\(G_1\)与\(G_2\)的异或图为一个图\(G\),其中图\(G\)的每条边在\(G_1\)与\(G_2\)中出现次数和为\(1\). 给你\(m\)个图,问你这\(m\)个 ...
- bzoj4671: 异或图
bzoj4671: 异或图 Description 定义两个结点数相同的图 G1 与图 G2 的异或为一个新的图 G, 其中如果 (u, v) 在 G1 与 G2 中的出现次数之和为 1, 那么边 ( ...
随机推荐
- 通过JDBC进行简单的增删改查(以MySQL为例) 目录
通过JDBC进行简单的增删改查(以MySQL为例) 目录 前言:什么是JDBC 一.准备工作(一):MySQL安装配置和基础学习 二.准备工作(二):下载数据库对应的jar包并导入 三.JDBC基本操 ...
- Java集合:LinkedList源码解析
Java集合---LinkedList源码解析 一.源码解析1. LinkedList类定义2.LinkedList数据结构原理3.私有属性4.构造方法5.元素添加add()及原理6.删除数据re ...
- diango中的url路由系统
一.url配置 url本质是url与要为该url调用的视图函数之间的映射表 urlpatterns = [正则,视图函数[,别名]] 二.正则表达式 1.匹配原则 django是循环urlpatter ...
- ABP框架系列之二十八:(Handling-Exceptions-异常处理)
Introduction This document is for ASP.NET MVC and Web API. If you're interested in ASP.NET Core, see ...
- Maths | 离散K-L变换/ 主成分分析法
目录 1. 概述 2. K-L变换方法和原理推导 2.1. 向量分解 2.2. 向量估计及其误差 2.3. 寻找最小误差对应的正交向量系 3. K-L变换高效率的本质 4. PCA在编.解码应用上的进 ...
- REdis AOF文件结构分析
REdis-4.0之前的AOF文件没有文件头,而从REdis-4.0开始AOF文件带有一个文件头,文件头格式和RDB文件头相同. REdis-4.0版本,如果开启aof-use-rdb-preambl ...
- Altera 在线资源使用
Altera 在线资源使用 Altera 在线资源使用 1 1.Altera中文版 2 2.建立myaltera账户 获取官网信息与支持 2 3系统化的设计资源 2 3.1.设计实例 2 3.2.参考 ...
- NLP常用术语解析
分词(Segment):中英文都存在分词的问题,不过相对来说,英文单词与单词之间本来就有空格进行分割,所以处理起来相对方便.但是中文书写是没有分隔符的,所以分词的问题就比较突出.分词常用的手段可以是基 ...
- OpenStack-Ocata版+CentOS7.6 云平台环境搭建 — 8.仪表盘 Dashboard(horizon)安装配置
仪表盘Dashboard(horizon)是一个web接口,使得云平台管理员以及用户可以管理不同的Openstack资源以及服务.这个部署示例使用的是 Apache Web 服务器. 节点配置信息说明 ...
- Spring 源码分析之 bean 依赖注入原理(注入属性)
最近在研究Spring bean 生命周期相关知识点以及源码,所以打算写一篇 Spring bean生命周期相关的文章,但是整理过程中发现涉及的点太多而且又很复杂,很难在一篇文章中把Spri ...