我能说什么!抽象了这!


看到 \(n\le 10\) 的黑题顿感大事不妙。

我们考虑设 \(f(i)\) 表示将 \(n\) 个点划分为至少 \(i\) 个连通块时的方案数。我们可以暴力枚举每个点在哪个连通块里。划分方案是 \(Bell(n)\le 21147\) 的。

显然的,相同块内暂时忽略,不同块间不能有边。于是我们将每张图的新边集定为这张图中所有的违法边。当一些新边集异或和为 \(0\) 时,表明我们找到了一个合法解。直接线性基加新边集。若向线性基中成功加入了 \(k\) 个新边集,那么对答案的贡献就是 \(2^{s-k}\)。这一部分的时间复杂度为 \(O(Bell(n)sn^2)\),注意卡常。

设 \(g(i)\) 表示 \(n\) 个点恰好划分成 \(i\) 个连通块时的方案数,那么我们可以将 \(i\) 个连通块放入 \(j\) 个集合中,每个集合再形成一个假连通块。这实际上就是 \(g(i)\) 对 \(f(j)\) 的贡献。将其表示为等式,即为:

\[f(m)=\sum_{i=m}^n\begin{Bmatrix}i\\m\end{Bmatrix}g(i)
\]

可以直接高斯消元,也可以根据斯特林反演,得到:

\[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)
\]

总体时间复杂度 \(O(Bell(n)sn^2)\)。

#include<bits/stdc++.h>
#define bi(x) x==1?2:x==3?3:x==6?4:x==10?5:x==15?6:x==21?7:x==28?8:x==36?9:10
#define int long long
using namespace std;
int t,n,len,a[15],num[50],f[15],sm[65];
int vs[65][50],tw[65];string s;
int add(int x){
for(int i=len-1;~i;--i){
if(!((x>>i)&1)) continue;
if(num[i]) x^=num[i];
else return num[i]=x,1;
}return 0;
}void check(int x){
int tot=0;
for(int i=0;i<len;++i) num[i]=0;
for(int j=1,k=0;j<=n;++j)
for(int l=j+1;l<=n;++l,++k) if(a[j]^a[l])
for(int i=1;i<=t;++i) sm[i]|=(vs[i][k]<<k);
for(int i=1;i<=t;i++) tot+=(!add(sm[i])),sm[i]=0;
f[x]+=tw[tot];
}void dfs(int x,int y){
if(x>n) return check(y);
for(a[x]=1;a[x]<=y;++a[x]) dfs(x+1,y);
dfs(x+1,y+1);
}signed main(){
ios::sync_with_stdio(0);
cin.tie(0),cout.tie(0);
cin>>t,tw[0]=1;
for(int i=1;i<=60;++i) tw[i]=tw[i-1]*2;
for(int i=1;i<=t;++i){
cin>>s;
if(!n) len=s.size(),n=bi(len);
for(int j=0;j<len;++j)
vs[i][j]=s[j]-'0';
}dfs(1,0);int ans=0,jc=1;
for(int i=1;i<=n;++i)
ans+=((i&1)?1:-1)*jc*f[i],jc*=i;
cout<<ans;
return 0;
}

[BZOJ4671] 异或图 题解的更多相关文章

  1. bzoj4671 异或图(斯特林反演,线性基)

    bzoj4671 异或图(斯特林反演,线性基) 祭奠天国的bzoj. 题解时间 首先考虑类似于容斥的东西. 设 $ f_{ i } $ 为至少有 $ i $ 个连通块的方案数, $ g_{ i } $ ...

  2. bzoj4671: 异或图——斯特林反演

    [BZOJ4671]异或图 - xjr01 - 博客园 考虑先算一些限制少的情况 gi表示把n个点的图,划分成i个连通块的方案数 连通块之间不连通很好处理(怎么处理看下边),但是内部必须连通,就很难办 ...

  3. bzoj4671: 异或图

    bzoj4671: 异或图 Description 定义两个结点数相同的图 G1 与图 G2 的异或为一个新的图 G, 其中如果 (u, v) 在 G1 与 G2 中的出现次数之和为 1, 那么边 ( ...

  4. BZOJ4671异或图

    题目描述 定义两个结点数相同的图 G1 与图 G2 的异或为一个新的图 G, 其中如果 (u, v) 在 G1 与 G2 中的出现次数之和为 1, 那么边 (u, v) 在 G 中, 否则这条边不在 ...

  5. BZOJ4671 异或图(容斥+线性基)

    题意 定义两个结点数相同的图 \(G_1\) 与图 \(G_2\) 的异或为一个新的图 \(G\) ,其中如果 \((u, v)\) 在 \(G_1\) 与 \(G_2\) 中的出现次数之和为 \(1 ...

  6. BZOJ4671 异或图 斯特林反演+线性基

    题目传送门 https://lydsy.com/JudgeOnline/problem.php?id=4671 题解 半年前刚学计数的时候对这道题怀着深深的景仰,现在终于可以来做这道题了. 类似于一般 ...

  7. 【BZOJ4671】异或图(斯特林反演)

    [BZOJ4671]异或图(斯特林反演) 题面 BZOJ Description 定义两个结点数相同的图 G1 与图 G2 的异或为一个新的图 G, 其中如果 (u, v) 在 G1 与 G2 中的出 ...

  8. 【XSY2701】异或图 线性基 容斥原理

    题目描述 定义两个图\(G_1\)与\(G_2\)的异或图为一个图\(G\),其中图\(G\)的每条边在\(G_1\)与\(G_2\)中出现次数和为\(1\). 给你\(m\)个图,问你这\(m\)个 ...

  9. BZOJ 4671 异或图 | 线性基 容斥 DFS

    题面 Description 定义两个结点数相同的图 G1 与图 G2 的异或为一个新的图 G, 其中如果 (u, v) 在 G1 与 G2 中的出现次数之和为 1, 那么边 (u, v) 在 G 中 ...

  10. 【BZOJ4671】 异或图

    Description 定义两个结点数相同的图 G1 与图 G2 的异或为一个新的图 G, 其中如果 (u, v) 在 G1 与 G2 中的出现次数之和为 1, 那么边 (u, v) 在 G 中, 否 ...

随机推荐

  1. bluetooth_stack开源蓝牙协议栈源码分析与漏洞挖掘

    文章首发地址 https://xz.aliyun.com/t/9205 前言 网上闲逛的时候,发现github有个开源的蓝牙协议栈项目 https://github.com/sj15712795029 ...

  2. LSTM学习三维轨迹的Python实现

    一.引言 长短期记忆网络(LSTM)是一种强大的递归神经网络(RNN),广泛应用于时间序列预测.自然语言处理等任务.在处理具有时间序列特征的数据时,LSTM通过引入记忆单元和门控机制,能够更有效地捕捉 ...

  3. idea 2023.1.2 破解/激活

    参考:(感谢作者提供的破解教程,谢谢) IntelliJ IDEA 2023.1.1最新激活破解教程(永久激活,亲测有效) - 异常教程 (exception.site) 下载idea : 链接:ht ...

  4. Qt/C++编写地图应用/离线地图下载/路径规划/轨迹回放/海量点/坐标转换

    一.前言说明 这个地图组件写了很多年了,最初设计的比较粗糙,最开始只是为了满足项目需要,并没有考虑太多拓展性,比如最初都是按照百度地图写死在代码中,经过这几年大量的现场实际应用,以及大量的用户提出的改 ...

  5. Qt/C++中英输入法/嵌入式输入法/小数字面板/简繁切换/特殊字符/支持Qt456

    一.前言 在嵌入式板子上由于没有系统层面的输入法支持,所以都绕不开一个问题,那就是在需要输入的UI软件中,必须提供一个输入法来进行输入,大概从Qt5.7开始官方提供了输入法的源码,作为插件的形式加入到 ...

  6. IM群聊消息的已读未读功能在存储空间方面的实现思路探讨

    1.引言 IM系统中,特别是在企业应用场景下,消息的已读未读状态是一个强需求. 以阿里的钉钉为例,钉钉的产品定位是用于商务交流,其"强制已读回执"功能,让职场人无法再"假 ...

  7. 2024新版本如何配置CLion与cubeMX开发STM32

    2024新版本如何配置CLion与cubeMX开发STM32 1. 为什么我要在网上有很多教程的情况下再做一个新版 各种大佬们给出的配置教程原本很详细,但是在时间过了这么久之后已经不完全符合现在的环境 ...

  8. UWP 读写文件

    List<Pics> pics = new List<Pics>(); for (int i = 0; i < 2000; i++) { pics.Add(new Pic ...

  9. JVM最全知识体系考点复盘总结

    1:什么是JVM JVM是Java Virtual Machine(Java虚拟机)的缩写,JVM是一种用于计算设备的规范,它是一个虚构出来的计算机,是通过在实际的计算机上仿真模拟各种计算机功能来实现 ...

  10. nginx平台初探-5

    nginx的请求处理阶段 (90%)   接收请求流程 (99%)   http请求格式简介 (99%) 首先介绍一下rfc2616中定义的http请求基本格式:   Request = Reques ...