[BZOJ4671] 异或图 题解
我能说什么!抽象了这!
看到 \(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)\) 的贡献。将其表示为等式,即为:
\]
可以直接高斯消元,也可以根据斯特林反演,得到:
\]
\]
总体时间复杂度 \(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] 异或图 题解的更多相关文章
- bzoj4671 异或图(斯特林反演,线性基)
bzoj4671 异或图(斯特林反演,线性基) 祭奠天国的bzoj. 题解时间 首先考虑类似于容斥的东西. 设 $ f_{ i } $ 为至少有 $ i $ 个连通块的方案数, $ g_{ i } $ ...
- bzoj4671: 异或图——斯特林反演
[BZOJ4671]异或图 - xjr01 - 博客园 考虑先算一些限制少的情况 gi表示把n个点的图,划分成i个连通块的方案数 连通块之间不连通很好处理(怎么处理看下边),但是内部必须连通,就很难办 ...
- bzoj4671: 异或图
bzoj4671: 异或图 Description 定义两个结点数相同的图 G1 与图 G2 的异或为一个新的图 G, 其中如果 (u, v) 在 G1 与 G2 中的出现次数之和为 1, 那么边 ( ...
- BZOJ4671异或图
题目描述 定义两个结点数相同的图 G1 与图 G2 的异或为一个新的图 G, 其中如果 (u, v) 在 G1 与 G2 中的出现次数之和为 1, 那么边 (u, v) 在 G 中, 否则这条边不在 ...
- BZOJ4671 异或图(容斥+线性基)
题意 定义两个结点数相同的图 \(G_1\) 与图 \(G_2\) 的异或为一个新的图 \(G\) ,其中如果 \((u, v)\) 在 \(G_1\) 与 \(G_2\) 中的出现次数之和为 \(1 ...
- BZOJ4671 异或图 斯特林反演+线性基
题目传送门 https://lydsy.com/JudgeOnline/problem.php?id=4671 题解 半年前刚学计数的时候对这道题怀着深深的景仰,现在终于可以来做这道题了. 类似于一般 ...
- 【BZOJ4671】异或图(斯特林反演)
[BZOJ4671]异或图(斯特林反演) 题面 BZOJ Description 定义两个结点数相同的图 G1 与图 G2 的异或为一个新的图 G, 其中如果 (u, v) 在 G1 与 G2 中的出 ...
- 【XSY2701】异或图 线性基 容斥原理
题目描述 定义两个图\(G_1\)与\(G_2\)的异或图为一个图\(G\),其中图\(G\)的每条边在\(G_1\)与\(G_2\)中出现次数和为\(1\). 给你\(m\)个图,问你这\(m\)个 ...
- BZOJ 4671 异或图 | 线性基 容斥 DFS
题面 Description 定义两个结点数相同的图 G1 与图 G2 的异或为一个新的图 G, 其中如果 (u, v) 在 G1 与 G2 中的出现次数之和为 1, 那么边 (u, v) 在 G 中 ...
- 【BZOJ4671】 异或图
Description 定义两个结点数相同的图 G1 与图 G2 的异或为一个新的图 G, 其中如果 (u, v) 在 G1 与 G2 中的出现次数之和为 1, 那么边 (u, v) 在 G 中, 否 ...
随机推荐
- vue3 封装api接口
新建axiosj.ts import axios from 'axios'; import { showMessage } from "./status"; // 引入状态码文件 ...
- CTF中RSA相关题型总结(持续更新)
e很小时: import gmpy2 from functools import reduce from Crypto.Util.number import long_to_bytes def CRT ...
- HarmonyOS Next 入门实战 - 基础组件、页面实现
基础组件 常用组件 Text:显示文本内容 Image:显示图片 Button:显示一个按钮 Column: 纵向布局 Row:横向布局 List:列表 各组件的用法 Text("文本组件& ...
- Qt tr 无法翻译
项目中碰到部分tr无法翻译的问题,最后发现由于继承QObject的子类没有加上Q_OBJECT宏.
- 一款可以完整保留排版的PDF翻译,GitHub增长第一
最近看论文较多,顺手给大家推荐一个用下来觉得不错的开源PDF翻译工具:PDFMathTranslate 目前这款开源项目在GitHub上已经收获了7.6K Star,而且由于一直处于增长趋势榜第一的位 ...
- COSBrowser 文件夹分享——多端文件实时共享
您还在为临时分享某个文件夹而烦恼吗? 您是否对授权的复杂度感到震惊? 关于存储桶 Policy 权限,您是否很迷茫,不知如何设置? 不用着急,用 COSBrowser 开始文件夹分享,一键简化分享 ...
- Electron 窗体 BrowserWindow
http://jsrun.net/t/KfkKp https://www.wenjiangs.com/doc/tlsizw1dst https://www.w3cschool.cn/electronm ...
- merging rhino 哈哈
- django模型层(orm相关知识点)
目录 一.模型层之前期准备 模型层的了解 模型 模型层的前置知识点 二.ORM常用关键字 三.ORM执行SQL语句 四.神奇的双下划线查询 五.ORM外键字段的创建 复习MySQL外键关系 外键字段的 ...
- SpringBoot结合Liquibase实现数据库变更管理
https://juejin.cn/post/7171232605478584328 https://juejin.cn/post/7170857098538909732 前言 研发过程中经常涉及到数 ...