【bzoj 4671】 异或图
神仙题啊神仙题
显然这个东西一脸不可求的样子啊,这种东西我们显然需要搞一个容斥什么的
于是设\(g_i\)表示至少存在\(i\)个联通块(联通块内部的边没有要求,联通块和联通块之间不存在边)的方案数,\(f_i\)表示恰有\(i\)个联通块
有
\]
即我们对于那些联通块个数多于\(x\)个的情况,可以把这\(i\)个联通快分成\(k\)组,每一组作为一个新的“联通块”,于是后面那个是一个第二类斯特林数
于是根据斯特林反演,有
\]
对于这道题我们要求的就是\(f_1\)
\]
现在要做的就是求\(g_i\)了
我们注意到这张图的点数很少,我们甚至可以爆搜一下每个点分到哪一个集合里去,我们就可以扫一遍每一张图,对于一条连接两个不同集合的边,我们把这条边用二进制状态存一下,现在只需要求出有多少个子集异或和为\(0\)就好了
这个问题可以用线性基来解决,结论就是如果有\(x\)个元素不能插入线性基,那么异或和为\(0\)的子集数量就是\(2^x\)个
这个可以这样理解啊,我们把不能插入线性基的元素拿出来,这些元素构成的子集个数是\(2^x\)个,显然\(2^x\)个子集也都能被线性基表示出来,我们把线性基里表示这些子集的那些元素和这些子集异或,就得到了\(2^x\)个异或和为\(0\)的子集,由于线性基里没有任何一个子集异或和为\(0\),于是总共就是\(2^x\)个
这样对于每一个不能插入线性基的元素都有两种选择,于是子集个数是\(2^x\)种
代码
#include<cstdio>
#include<cstring>
#define re register
#define LL long long
int m,n,len,t;LL ans,cnt;
char S[1005];
LL fac[15],pw[105],lb[50],g[15],b[66];
int a[15],vis[66][15][15];
inline int ins(LL x) {
for(re int i=t-1;i>=0;--i)
if(x>>i&1) {
if(!lb[i]) {lb[i]=x;return 1;}
x^=lb[i];
}
return 0;
}
void dfs(int x,int now) {
if(x==n+1) {
t=0;memset(lb,0,sizeof(lb));
for(re int k=1;k<=m;k++) {
b[k]=t=0;
for(re int i=1;i<=n;i++)
for(re int j=i+1;j<=n;j++)
if(a[i]!=a[j]) b[k]|=(1ll*vis[k][i][j]<<t),t++;
}
int tot=0;
for(re int k=1;k<=m;k++) if(!ins(b[k])) ++tot;
g[now]+=pw[tot];
return;
}
for(re int i=1;i<=now;i++) a[x]=i,dfs(x+1,now);
a[x]=now+1;dfs(x+1,now+1);
}
int main() {
scanf("%d",&m);
for(re int k=1;k<=m;k++) {
scanf("%s",S+1);len=strlen(S+1);
if(!n) {n=1;while(n*(n-1)/2!=len) n++;}
int now=1;
for(re int i=1;i<=n;i++)
for(re int j=i+1;j<=n;j++)
vis[k][i][j]=S[now]-'0',now++;
}
fac[0]=1;pw[0]=1;
for(re int i=1;i<=m;i++) pw[i]=pw[i-1]+pw[i-1];
for(re int i=1;i<=n;i++) fac[i]=1ll*fac[i-1]*i;
dfs(1,0);
for(re int i=1;i<=n;i++) ans+=1ll*((i&1)?1:-1)*fac[i-1]*g[i];
printf("%lld\n",ans);
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]异或图
Description 题库链接 给定 \(s\) 个结点数相同且为 \(n\) 的图 \(G_1\sim G_s\) ,设 \(S = \{G_1, G_2,\cdots , G_s\}\) ,问 ...
- 【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, 那么边 ( ...
随机推荐
- 2019牛客暑期多校训练营(第八场) E 线段树+可撤销并查集
题目传送门 题意: 给出m条无向边,每条边都有一个$[l,r]$,意思是体积在这个范围内的人才能通过这条边,询问有多少种体积的可能性,能使人从1到n 思路:由于是无向边,1和n的连通性可以用并查集维护 ...
- CSIC_716_20191118【常用模块的用法 Json、pickle、collections、openpyxl】
序列化模块 序列化:将python或其他语言中的数据类型,转变成字符串类型. python中的八大数据类型回顾:int float str list tuple dict set bool 反序列化: ...
- leetcode-第10周双周赛-5099验证回文字符串③
题目描述: 方法:动态规划 class Solution: def isValidPalindrome(self, s: str, k: int) -> bool: def isKPalRec( ...
- scala中Array简单实用
/** * 在scala中数组的使用 * 和java很类似,初始化后,长度就固定了,而且元素全部根据其类型初始化 * */ object arrayUse { def main(args: Array ...
- day14 python02---字符串
day02 数字相关的转换 bin() 2进制oct() 8进制hex() 16进制 字符串 定义:它是一个有序的字符的集合,用于存储和表示基本的文本信息,‘’或“”或‘’‘ ’‘’中间包含的内容称之 ...
- python模块operator对排序的辅助功能
一.介绍 该operator模块导出一组与Python的内部运算符相对应的高效函数.例如,等同于表达式.函数名称是用于特殊类方法的函数名称; 为方便起见,还提供了没有前导和尾随的变体.operator ...
- hdu多校第四场 1007 (hdu6620) Just an Old Puzzle 逆序对
题意: 给你一个数字拼图,问你数字拼图能否能复原成原来的样子. 题解: 数字拼图的性质是,逆序数奇偶相同时,可以互相转化,逆序数奇偶不同,不能互相转化. 因此统计逆序对即可. #include< ...
- mysql索引原理深度解析
mysql索引原理深度解析 一.总结 一句话总结: mysql索引是b+树,因为b+树在范围查找.节点查找等方面优化 hash索引,完全平衡二叉树,b树等 1.数据库中最常见的慢查询优化方式是什么? ...
- CSS display overflow 属性 cursor光标类型
display属性 功能:规则网页元素如何显示的问题. 取值:none(隐藏).block(以块元素显示).inline(以行内元素显示) block:可以实现将行内元素转成块元素. ...
- element table初始化默认选中以及切换页码的时候保留选中状态
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <!-- impor ...