bzoj4671: 异或图
bzoj4671: 异或图
Description
定义两个结点数相同的图 G1 与图 G2 的异或为一个新的图 G, 其中如果 (u, v) 在 G1 与
G2 中的出现次数之和为 1, 那么边 (u, v) 在 G 中, 否则这条边不在 G 中.
现在给定 s 个结点数相同的图 G1...s, 设 S = {G1, G2, . . . , Gs}, 请问 S 有多少个子集的异
或为一个连通图?
Input
第一行为一个整数s, 表图的个数.
接下来每一个二进制串, 第 i 行的二进制串为 gi, 其中 gi 是原图通过以下伪代码转化得
到的. 图的结点从 1 开始编号, 下面设结点数为 n.
Algorithm 1 Print a graph G = (V, E)
for i = 1 to n do
for j = i + 1 to n do
if G contains edge (i, j) then
print 1
else
print 0
end if
end for
end for
$ 2 ≤ n ≤ 10,1 ≤ s ≤ 60.$
Output
输出一行一个整数, 表示方案数
这道题刚看没什么思路。
\]
可以得到:
\]
所以答案为
\]
直接考虑这个式子容斥系数找规律也得到的结果相同。
我们知道\(s(i,1) = (i-1)!\),阶乘和-1的幂次可以预处理,所以我们只要求出\(f[i]\)即可
我们用\(Bell(n)\)的复杂度枚举子集划分,把每个子集作为一个块,两个不同块之间不能连边,块内任意。
对于每一个图,用一个01向量表示两个不同块之间连每一条边的有无。
这样我们就转化为求有多少个子集异或为0
这个东西,我们求一下线性基,记线性基的元素个数为num
线性基里的向量是线性无关的,而其他的\(2^{s-num}\)个集合是一定可以通过异或线性基里的某些元素(或不异或)得到0的
所以答案即为\(2^{s-num}\)
但是这样直接做似乎会TLE,需要讲跨越块的边单独拿出来重新编号
还有一种方法,运用到一个性质:对于线性基的高斯消元,竖着消和横着消所得到的非0向量个数是相同的。
这个东西我不会证
#include<bits/stdc++.h>
using namespace std;
#define REP(i,st,ed) for(register int i=st,i##end=ed;i<=i##end;++i)
#define DREP(i,st,ed) for(register int i=st,i##end=ed;i>=i##end;--i)
typedef long long ll;
inline int read(){
int x;
char c;
int f=1;
while((c=getchar())!='-' && (c<'0' || c>'9'));
if(c=='-') c=getchar(),f=-1;
x=c^'0';
while((c=getchar())>='0' && c<='9') x=(x<<1)+(x<<3)+(c^'0');
return x*f;
}
inline ll readll(){
ll x;
char c;
ll f=1;
while((c=getchar())!='-' && (c<'0' || c>'9'));
if(c=='-') c=getchar(),f=-1;
x=c^'0';
while((c=getchar())>='0' && c<='9') x=(x<<1ll)+(x<<3ll)+(c^'0');
return x*f;
}
const int maxm=60+1,maxn=10+1;
int n,m;
char s[maxm];
bool E[maxm][maxn][maxn];
int p[maxn],id[maxn][maxn];
ll a[maxm];
ll fac[maxm],ans;
struct point{
int x,y;
}b[maxm];
void dfs(int x,int num){
if(x>n){
memset(a,0,sizeof(a));
int res=0,tmp=-1;
REP(i,1,n) REP(j,i+1,n) if(p[i]!=p[j]) b[++tmp]=(point){i,j};
REP(i,1,m){
ll nw=0;
REP(j,0,tmp) if(E[i][b[j].x][b[j].y]) nw|=(1ll<<(ll)j);
DREP(j,tmp,0)
if(nw&(1ll<<(ll)j)){
if(a[j]) nw^=a[j];
else{
a[j]=nw;res++;
break;
}
}
}
/* REP(i,1,n) REP(j,i+1,n){
if(p[i]==p[j]) continue;
ll nw=0;
REP(k,1,m) if(E[k][i][j]) nw|=(1ll<<(ll)(k-1));
DREP(k,m-1,0)
if(nw&(1ll<<(ll)k)){
if(a[k]) nw^=a[k];
else{
a[k]=nw;res++;
break;
}
}
}
*/
ans+=fac[num-1]*(1ll<<(ll)(m-res));
return;
}
REP(i,1,num+1) p[x]=i,dfs(x+1,max(num,i));
}
int main(){
#ifndef ONLINE_JUDGE
freopen("cnt.in","r",stdin);
freopen("cnt.out","w",stdout);
#endif
m=read();
scanf("%s",s+1);int len=strlen(s+1);
while(n*(n-1)/2<len) ++n;len=0;
REP(i,1,n)
REP(j,i+1,n)
E[1][i][j]=s[id[i][j]=++len]-'0';
REP(k,2,m){
len=0;scanf("%s",s+1);
REP(i,1,n) REP(j,i+1,n) E[k][i][j]=s[++len]-'0';
}
fac[0]=1;
REP(i,1,n) fac[i]=-fac[i-1]*i;
dfs(1,0);
printf("%lld\n",ans);
return 0;
}
bzoj4671: 异或图的更多相关文章
- bzoj4671: 异或图——斯特林反演
[BZOJ4671]异或图 - xjr01 - 博客园 考虑先算一些限制少的情况 gi表示把n个点的图,划分成i个连通块的方案数 连通块之间不连通很好处理(怎么处理看下边),但是内部必须连通,就很难办 ...
- bzoj4671 异或图(斯特林反演,线性基)
bzoj4671 异或图(斯特林反演,线性基) 祭奠天国的bzoj. 题解时间 首先考虑类似于容斥的东西. 设 $ f_{ i } $ 为至少有 $ i $ 个连通块的方案数, $ g_{ i } $ ...
- 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】异或图(容斥+斯特林反演+线性基)
传送门 题意: 给出\(s,s\leq 60\)张图,每张图都有\(n,n\leq 10\)个点. 现在问有多少个图的子集,满足这些图的边"异或"起来后,这张图为连通图. 思路: ...
随机推荐
- mybatis配置文件配错
UG] 2017-10-04 20:04:30,582(137226) --> [http-bio-8082-exec-9] org.springframework.web.servlet.ha ...
- iframe跨域解决方案
公司某个功能用的是iframe,由于跨域的原因,我们不能直接设置父级页面iframe的高度,所以用了一个中间页home来完成父级页面iframe的高度设置,这种中间页其实很多时候不好用,因为涉及到页面 ...
- # 【Python3练习题 003】一个整数,它加上100后是一个完全平方数,再加上168又是一个完全平方数,请问该数是多少?
# -------------------------------------------------## 所谓的“完全平方数”,就是开完根号仍然是整数.## 数学渣是这么思考的:假设这个数 i 在1 ...
- js-XMLHttpRequest 2级
###1. XMLHttpRquest 2级 1) FormData 现代web应用中频繁使用的一项功能就死表单数据的序列化, XMLHttpRquest 2级为此定义了FormData类型 Fo ...
- Prime Permutation
Prime Permutation 原题地址: http://codeforces.com/problemset/problem/123/A 题目大意: 给你一个字符串(只包含小写字母),从1开始存放 ...
- 利用js给datalist或select动态添加option选项
<!DOCTYPE html> <html> <head> <title>鼠标点击时加载</title> <script type=& ...
- 原生JS实现增加删除class
<!DOCTYPE html> <html> <head> <style type="text/css"> .night-mode{ ...
- js删除数组元素
一.清空数组 var ary = [1,2,3,4]; ary.splice(0,ary.length);//清空数组 console.log(ary); // 输出 [],空数组,即被清空了 二.删 ...
- 使用阿里云OSS,上传图片时报错:java.lang.ClassNotFoundException:org.apache.http.ssl.TrustStrategy
问题产生的原因就是jar包版本问题,阿里的SDk引入的pom中依赖的httpclient和httpcore版本高于当前项目中已经设置的版本. 解决: 删除低版本后,更新下项目.
- 关于对ProgressBar定义模板的一些总结
在之前的博客中曾经写到了一篇关于如何定义圆形进度条的文章,今天就ProgressBar再来进行一些总结,首先来介绍一下ProgressBar的结构,ProgressBar控件的模板有两个部分,我们在定 ...