bzoj4671: 异或图——斯特林反演
[BZOJ4671]异或图 - xjr01 - 博客园
考虑先算一些限制少的情况
gi表示把n个点的图,划分成i个连通块的方案数
连通块之间不连通很好处理(怎么处理看下边),但是内部必须连通,就很难办了
所以再降低条件,fi表示,把n个点的图,划分成i个"连通块",保证连通块之间不会有边相连,但是内部可以不连通的方案数
fi计算方法如下:
用Bell(n)的复杂度枚举集合划分,然后相邻集合之间不能连边,
然后考虑凑出符合这个集合划分的图有多少个,异或高斯消元,xi表示第i个图选择与否,如果必须不选,等号右边就是0,否则不管。
求自由元个数
fi和gi的关系:
就是枚举到底是有几个连通块
然后斯特林反演:
虽然往上枚举,但是式子证明思路是一样的,(-1)项的指数只要保证在所谓[n=m]时候是偶数就好了
高斯消元也可以换成线性基
每个图一个元素。每个线性基的位表示这个图这个边有没有,并且再和这次必要的边取&
要求多少个子集xor为全0
线性基之后,2^(s-sz)即可。
代码:
#include<bits/stdc++.h>
#define reg register int
#define il inline
#define numb (ch^'0')
#define int long long
using namespace std;
typedef long long ll;
il void rd(int &x){
char ch;x=;bool fl=false;
while(!isdigit(ch=getchar()))(ch=='-')&&(fl=true);
for(x=numb;isdigit(ch=getchar());x=x*+numb);
(fl==true)&&(x=-x);
}
namespace Miracle{
const int M=;
const int N=;
int n,m;
int edge[M][][];
ll f[*];
ll t[N];
int ans[M];
char s[N*N];
ll id[N];
int vis[*];
ll Guass(int n){
memset(ans,-,sizeof ans);
memset(vis,,sizeof vis);
// for(reg i=1;i<=n;++i){
// for(reg j=1;j<=m;++j){
// cout<<f[i][j]<<" ";
// }cout<<" = "<<f[i][m+1]<<endl;
// }
// cout<<endl;
int free=;
for(reg i=;i<=m;++i){
int id=;
for(reg j=;j<=n;++j){
if((!vis[j])&&(f[j]&(1LL*<<(i-)))) id=j;
}
if(!id){
++free;continue;
}
vis[i]=;
if(id!=i) swap(f[i],f[id]);
for(reg j=;j<=n;++j){
if(j==i) continue;
if(!vis[j]&&(f[j]&(1LL*<<(i-)))){
f[j]^=f[i];
}
}
}
return (1LL*<<free);
}
void dfs(int x,int sz){
if(x==n+){
//cout<<" x "<<x<<" sz "<<sz<<endl;
memset(f,,sizeof f);
int cnt=;
for(reg i=;i<=n;++i){
for(reg j=i+;j<=n;++j){
if(id[i]!=id[j]){
++cnt;
for(reg k=;k<=m;++k){
if(edge[k][i][j]) f[cnt]|=(1LL*<<(k-));
}
}
}
}
// cout<<" cnt "<<cnt<<endl;
t[sz]+=Guass(max(cnt,m));
return;
}
for(reg i=;i<=sz;++i){
id[x]=i;
dfs(x+,sz);
id[x]=;
}
id[x]=sz+;
dfs(x+,sz+);
id[x]=;
}
void calc(int l){
for(n=;n<=;++n){
if(n*(n-)/==l) break;
}
}
int main(){
rd(m);
for(reg i=;i<=m;++i){
scanf("%s",s+);
int l=strlen(s+);
if(!n) calc(l);
int t=;
for(reg j=;j<=n;++j){
for(reg k=j+;k<=n;++k){
++t;
edge[i][j][k]=edge[i][k][j]=s[t]-'';
}
}
}
dfs(,);
ll ans=,jie=;
for(reg i=;i<=n;++i){
if(i&){
ans+=jie*t[i];
}else{
ans-=jie*t[i];
}
jie*=i;
}
printf("%lld",ans);
return ;
} }
signed main(){
Miracle::main();
return ;
} /*
Author: *Miracle*
Date: 2019/2/16 21:40:44
*/
总结:
找到两个数组f,g
f范围宽松好统计,g范围严格难统计但是和答案有直接关系,
这样,只要得到f和g的关系,就可以找到答案!
异或下线性方程组的自由元个数:
先变成n*(n+1)的矩阵
然后高斯消元,如果某一个id找不到,那么一定是自由元了,计数器++
注意,每次找i和消除必须在全局位置,并且用一个vis标记表示是否还能动
最后削成的上三角矩阵,除了无解情况,剩下的一定有唯一解
bzoj4671: 异或图——斯特林反演的更多相关文章
- bzoj4671 异或图(斯特林反演,线性基)
bzoj4671 异或图(斯特林反演,线性基) 祭奠天国的bzoj. 题解时间 首先考虑类似于容斥的东西. 设 $ f_{ i } $ 为至少有 $ i $ 个连通块的方案数, $ g_{ i } $ ...
- BZOJ4671 异或图 斯特林反演+线性基
题目传送门 https://lydsy.com/JudgeOnline/problem.php?id=4671 题解 半年前刚学计数的时候对这道题怀着深深的景仰,现在终于可以来做这道题了. 类似于一般 ...
- 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】异或图(斯特林反演)
[BZOJ4671]异或图(斯特林反演) 题面 BZOJ Description 定义两个结点数相同的图 G1 与图 G2 的异或为一个新的图 G, 其中如果 (u, v) 在 G1 与 G2 中的出 ...
- 【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 \) 个连通块的方 ...
随机推荐
- Android ContenObserver 监听联系人数据变化
一.知识介绍 1.ContentProvider是内容提供者 ContentResolver是内容解决者(对内容提供的数据进行操作) ContentObserver是内容观察者(观察内容提供者提供的数 ...
- Django 如何让ajax的POST方法带上CSRF令牌
问题 大家知道,在大前端领域,有一种叫做ajax的东东,即“Asynchronous Javascript And XML”(异步 JavaScript 和 XML),它被用来在不刷新页面的情况下,提 ...
- 容器化系列 - Zookeeper启动和配置 on Docker
本文简要说明了如何在Docker容器中启动和配置Zookeeper. 1 准备工作 1.1 下载zookeeper镜像 $ docker pull zookeeper:3.4 1.2 单点模式 安装D ...
- MVC文件的上传、删除
public ActionResult FileUpload() { Users users = new Users(); users = ( ...
- org.springframework.beans.factory.NoUniqueBeanDefinitionException 导致原因之一
导致此异常原因很多,以下仅是针对其中一种因素的解决办法. 下面是DAO接口.Service接口.Service实现类的全路径名(全部定义在com.xxx.projetc包下) com.xxx.proj ...
- Scrapy案例02-腾讯招聘信息爬取
目录 1. 目标 2. 网站结构分析 3. 编写爬虫程序 3.1. 配置需要爬取的目标变量 3.2. 写爬虫文件scrapy 3.3. 编写yield需要的管道文件 3.4. setting中配置请求 ...
- spring boot拦截器WebMvcConfigurerAdapter,以及高版本的替换方案(转)
文章转自 http://blog.51cto.com/12066352/2093750 最近项目采用spring icloud,用的spring boot版本是1.5.x的,spring boot 2 ...
- PyInstaller Extractor安装和使用方法
PyInstaller Extractor是可以提取出PyInstaller所创建的windows可执行文件的资源内容. 关于PyInstaller的介绍:PyInstaller安装使用方法 使用Py ...
- 程序员修神之路--🤠分布式高并发下Actor模型如此优秀🤠
写在开始 一般来说有两种策略用来在并发线程中进行通信:共享数据和消息传递.使用共享数据方式的并发编程面临的最大的一个问题就是数据条件竞争.处理各种锁的问题是让人十分头痛的一件事. 传统多数流行的语言并 ...
- docker(一) Centos7下安装docker
docker(一) Centos7下安装dockerdocker(二) windows10下安装dockerdocker(三) 镜像和容器常用命令 docker(四) 使用Dockerfile构建镜像 ...