bzoj4671 异或图(斯特林反演,线性基)
bzoj4671 异或图(斯特林反演,线性基)
祭奠天国的bzoj。
题解时间
首先考虑类似于容斥的东西。
设 $ f_{ i } $ 为至少有 $ i $ 个连通块的方案数, $ g_{ i } $ 为正好有 $ i $ 个连通块的方案数。
那么有
\]
斯特林反演就有
\]
其中
\]
那么考虑求 $ f_{ i } $ 。
枚举所有可能的子集划分,复杂度为 $ Bell(n) $ ,
对于每个划分,要保证划分之间的边全部不存在,
由此得出异或方程组,设秩为 $ c $ ,则对答案贡献为 $ 2^{ s - c } $ 。
线性基解决。
代码
#include<bits/stdc++.h>
using namespace std;
typedef long long lint;
struct pat{int x,y;pat(int x=0,int y=0):x(x),y(y){}bool operator<(const pat &p)const{return x==p.x?y<p.y:x<p.x;}};
template<typename TP>inline void read(TP &tar)
{
TP ret=0,f=1;char ch=getchar();
while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
while(ch>='0'&&ch<='9'){ret=ret*10+(ch-'0');ch=getchar();}
tar=ret*f;
}
template<typename TP,typename... Args>inline void read(TP& t,Args&... args){read(t),read(args...);}
namespace RKK
{
const int N=12,M=62;
int n,m,len;lint ans;
char str[114];
bool mp[M][N][N];
lint fac[N];
int bl[N];
lint b[M];
void dfs(int x,int cnt)
{
if(x>n)
{
int s=0;
for(int i=1;i<=n;i++)for(int j=i+1;j<=n;j++)if(bl[i]!=bl[j])
{
lint val=0;
for(int k=1;k<=m;k++)if(mp[k][i][j]) val|=(1ll<<(k-1));
for(int k=1;k<=s;k++) if((val^b[k])<val) val^=b[k];
if(val) b[++s]=val;
}
ans+=fac[cnt]*(1ll<<(m-s));
return;
}
for(int i=1;i<=cnt+1;i++)
bl[x]=i,dfs(x+1,max(cnt,i));
}
int main()
{
read(m);for(int i=1;i<=m;i++)
{
scanf("%s",str+1);if(i==1){len=strlen(str+1);while(n*(n-1)/2!=len) n++;}
for(int j=1,o=0;j<=n;j++)for(int k=j+1;k<=n;k++) mp[i][j][k]=str[++o]-'0';
}
fac[1]=1;for(int i=2;i<=n;i++) fac[i]=fac[i-1]*(1-i);
dfs(1,0),printf("%lld\n",ans);
return 0;
}
}
int main(){return RKK::main();}
bzoj4671 异或图(斯特林反演,线性基)的更多相关文章
- BZOJ4671 异或图 斯特林反演+线性基
题目传送门 https://lydsy.com/JudgeOnline/problem.php?id=4671 题解 半年前刚学计数的时候对这道题怀着深深的景仰,现在终于可以来做这道题了. 类似于一般 ...
- bzoj4671: 异或图——斯特林反演
[BZOJ4671]异或图 - xjr01 - 博客园 考虑先算一些限制少的情况 gi表示把n个点的图,划分成i个连通块的方案数 连通块之间不连通很好处理(怎么处理看下边),但是内部必须连通,就很难办 ...
- BZOJ4671 异或图(容斥+线性基)
题意 定义两个结点数相同的图 \(G_1\) 与图 \(G_2\) 的异或为一个新的图 \(G\) ,其中如果 \((u, v)\) 在 \(G_1\) 与 \(G_2\) 中的出现次数之和为 \(1 ...
- 【bzoj4671】异或图(容斥+斯特林反演+线性基)
传送门 题意: 给出\(s,s\leq 60\)张图,每张图都有\(n,n\leq 10\)个点. 现在问有多少个图的子集,满足这些图的边"异或"起来后,这张图为连通图. 思路: ...
- 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 \) 个连通块的方 ...
- bzoj4671: 异或图
bzoj4671: 异或图 Description 定义两个结点数相同的图 G1 与图 G2 的异或为一个新的图 G, 其中如果 (u, v) 在 G1 与 G2 中的出现次数之和为 1, 那么边 ( ...
- BZOJ4671异或图
题目描述 定义两个结点数相同的图 G1 与图 G2 的异或为一个新的图 G, 其中如果 (u, v) 在 G1 与 G2 中的出现次数之和为 1, 那么边 (u, v) 在 G 中, 否则这条边不在 ...
- P5169 xtq的异或和(FWT+线性基)
传送门 我咋感觉我学啥都是白学-- 首先可以参考一下这一题,从中我们可以知道只要知道两点间任意一条路径以及整个图里所有环的线性基,就可以得知这两个点之间的所有路径的异或和 然而我好像并不会求线性基能张 ...
随机推荐
- SQL注入蠕虫分析//未完待续
蠕虫代码: DECLARE @S VARCHAR(4000);SET @S=CAST(0x4445434C415245204054205641524348415228323535292C4043205 ...
- mongodb4.x 集群搭建
下载包 官网选择合适的操作系统版本下载tgz包 https://www.mongodb.com/download-center/community 部署结构 集群结构 典型的三分片Mongo集群如下图 ...
- Python面向对象之 - 继承
情况一: 子类完全继承父类所有的属性和方法, 自己没有一点更改. class Person(): def __init__(self, name, age): self.name = name se ...
- python2发微信脚本
#!/usr/bin/env python # -*- coding: utf-8 -*- import urllib,urllib2,json import sys reload(sys) sys. ...
- Python中编码encode()与解码decode()
1 print('这是编码'.encode('utf-8')) # 结果 b'\xe8\xbf\x99\xe6\x98\xaf\xe7\xbc\x96\xe7\xa0\x81' 2 print('这是 ...
- Visual Studio 2017-2019版本创建C#项目时没有创建网站这一选项?
通过了解以后发现Visual Studio 2017之后的版本在新建选项中已经不再有这一选择项了. 解决办法: 1.在创建新项目的面板滑倒最下面,---> 安装多个人工具和功能 2.这时已经打开 ...
- 微信小程序使用weui扩展组件踩坑
最近在做微信小程序,引入weui的时候踩坑了好久,这里记录一下遇到的问题. 微信官方文档给了两种weui引入方式: 通过 useExtendedLib 扩展库 的方式引入,这种方式引入的组件将不会计入 ...
- AntBlazor Theme in ABP Framework
介绍 ABP抽象了主题系统,将已有的UI更改到其他的UI框架非常简单,本文介绍了如何将主题切换为AntBlazor Theme. 源码以及示例在Gihub开源. Lsw.Abp.AntDesignUI ...
- Python:在一个Python程序中,运行另一个Python程序
学习自: 1~3学习自如何在python中执行另一个py文件_python_脚本之家 4~6学习自Python中四种运行其他程序的方式 - hankleo - 博客园 1.os.system方法 用法 ...
- Matplotlib:Python三维绘图
1.创建三维坐标轴对象Axes3D 创建Axes3D主要有两种方式,一种是利用关键字projection='3d'来实现,另一种是通过从mpl_toolkits.mplot3d导入对象Axes3D来实 ...