题目描述

定义两个结点数相同的图 G1 与图 G2 的异或为一个新的图 G, 其中如果 (u, v) 在 G1 与
G2 中的出现次数之和为 1, 那么边 (u, v) 在 G 中, 否则这条边不在 G 中.
现在给定 s 个结点数相同的图 G1...s, 设 S = {G1, G2, . . . , Gs}, 请问 S 有多少个子集的异
或为一个连通图?
题解
先考虑一个dp。
对于这种连通性问题的dp我们通常是设一个f数组一个g数组,然后找到这两个数组的关系。
我们定义g[i]表示恰好有i个联通块的方案数(是指把点集分割成i个集合,不同集合之间不能连边,相同集合之间连通)。
考虑再设置f[i]表示至少有i个联通块的方案数(同上,只是相同集合之间也可以不连通)。
那么我们的转移有:f[i]=∑s(j,i)g[j]
由于我们要求g,就斯特林反演一下。
g[i]=∑(-1)j-iS(j,i)f[j]
其实我们只需要求g[1]
g[1]=∑(-1)i-1S(i,1)f[i]
g[1]=∑(-1)i-1(i-1)!f[i]
我们可以以贝尔数的复杂度枚举这n个点的集合划分,然后算出有多少种图的选择方案可以保证不同集合之间没有连边。
对于每一条跨越集合中的边,我们可以写出一个方程。
a1G1^a2G2^a3G3.....=0
ai为0/1表示这条边是否在Gi这张图中存在。
它显然是有解的(全取0就可以了
我们要做的是求解得个数,答案为2自由元
我们可以用线性基来模拟高斯消元的过程,自由元的个数就是最后线性基中0的个数。
代码
#include<iostream>
#include<cstdio>
#include<cmath>
#include<cstring>
using namespace std;
typedef long long ll;
ll jie[],be[],n,G,x[],ans;
char s[];
int g[][][];
inline int rd(){
int x=;char c=getchar();bool f=;
while(!isdigit(c)){if(c=='-')f=;c=getchar();}
while(isdigit(c)){x=(x<<)+(x<<)+(c^);c=getchar();}
return f?-x:x;
}
void solve(int now,int cnt){
if(now>n){
for(int i=;i<=n;++i)
for(int j=i+;j<=n;++j)if(be[i]!=be[j]){
ll tmp=;
for(int k=;k<=G;++k)tmp|=(1ll*g[k][i][j]<<k-);
for(int k=G-;k>=;--k)if(tmp&(1ll<<k)){
if(!x[k]){x[k]=tmp;break;}
tmp^=x[k];
}
}
int num=;
for(int i=;i<G;++i)if(x[i])num++;
ans+=((cnt&)?:-)*(1ll<<(G-num))*jie[cnt-];
for(int i=;i<G;++i)x[i]=;
}
else{
for(int j=;j<=cnt+;++j){be[now]=j;solve(now+,max(cnt,j));}
}
}
int main(){
G=rd();
for(int i=;i<=G;++i){
scanf("%s",s+);
n=strlen(s+);
n=(+sqrt(+*n))/;int now=;
for(int j=;j<=n;++j)for(int k=j+;k<=n;++k){g[i][j][k]=s[now]-'';now++;}
}
jie[]=;
for(int i=;i<=n;++i)jie[i]=jie[i-]*i;
solve(,);
cout<<ans;
return ;
}

BZOJ4671异或图的更多相关文章

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

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

  2. bzoj4671: 异或图

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

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

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

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

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

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

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

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

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

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

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

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

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

  9. 【bzoj4671】异或图(容斥+斯特林反演+线性基)

    传送门 题意: 给出\(s,s\leq 60\)张图,每张图都有\(n,n\leq 10\)个点. 现在问有多少个图的子集,满足这些图的边"异或"起来后,这张图为连通图. 思路: ...

随机推荐

  1. LayoutInflater.inflate()方法两个参数和三个参数

    转载请标明出处:https://www.cnblogs.com/tangZH/p/7074853.html  很多人都用过LayoutInflater(布局填充器) 对于我来说通常使用下面两种:Lay ...

  2. java之日志管理

    一. 为什么要使用日志 二. 常见日志框架介绍 三. Logback+SLF4J实战 四. 项目源码下载 五. 参考文章   一. 为什么要使用日志 1. 对IT安全至关重要   当您使用强大的日志管 ...

  3. InsecureRequestWarning: Unverified HTTPS request is being made. Adding certificate verification is strongly advised.解决办法

    最近使用requests进行get请求的时候,控制台输出如下错误. InsecureRequestWarning: Unverified HTTPS request is being made. Ad ...

  4. 通过shell命令往android中写入配置

    C:\Users>adb shell setprop "persist.sys.btylevel" 100 C:\Users>adb shell getprop &qu ...

  5. C#基础知识之特性

    一.什么是特性 个人理解:特性本质上也是有一种类,通过添加特性,就可以实例化这个特性类:添加特性就是在类.方法.结构.枚举.组件等上面加一个标签,使这些类.方法.结构.枚举.组件等具有某些统一的特征, ...

  6. CF786B Legacy(线段树优化建图)

    嘟嘟嘟 省选Day1T2不仅考了字符串,还考了线段树优化建图.当时不会,现在赶快学一下. 线段树能优化的图就是像这道题一样,一个点像一个区间的点连边,或一个区间像一个点连边.一个个连就是\(O(n ^ ...

  7. 好程序员技术教程分享JavaScript运动框架

    好程序员技术教程分享JavaScript运动框架,有需要的朋友可以参考下. JavaScript的运动,即让某元素的某些属性由一个值变到另一个值的过程.如让div的width属性由200px变到400 ...

  8. Nvidia和Google的AI芯片战火蔓延至边缘端

    AI 的热潮还在持续,AI 的战火自然也在升级.英伟达作为这一波 AI 浪潮中最受关注的公司之一,在很大程度上影响着 AI 的战局.上周在美国举行的 GTC 2019 上,黄仁勋大篇幅介绍了英伟达在 ...

  9. 如何在Jupyter里以不同的运行模式使用Pyspark

    假设你的环境已经安装好了以下东西,如何详细的安装它们不在本文的讨论范围之内 具体的可疑参考三分钟搞定jupyter和pyspark整合 anaconda2 findspark pyspark 这里多说 ...

  10. 【Swift 3.1】iOS开发笔记(四)

    一.唱片旋转效果(360°无限顺时针旋转) func animationRotateCover() { coverImageView.layer.removeAllAnimations() let a ...