bzoj 4671 异或图 —— 容斥+斯特林反演+线性基
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=4671
首先,考虑容斥,就是设 \( t[i] \) 表示至少有 \( i \) 个连通块的方案数;
我们希望得到恰好有一个连通块的方案数,但这里不能直接 \( + t[1] - t[2] + t[3] - t[4] ... \),因为每个“恰好 \( i \) 个连通块”的情况并不是在各种 \( t[j] ( j<=i ) \) 中只被算了一次,而是因为标号,被算了 \( S(i,j) \) 次;
所以希望得到一个容斥系数 \( f[i] \) ,若设 \( g[m] \) 表示恰好 \( m \) 个连通块的情况,则令 \( g[m] = \sum\limits_{i=1}^{m} S(m,i) * f[i] * t[i] \)
又因为 \( ans = g[1] \),所以干脆令 \( f[i] \) 满足 \( [m=1] = \sum\limits_{i=1}^{m} S(m,i) * f[i] \),代入 \( t[i] \),算出的就是 \( g[1] \) ,即答案;
可以斯特林反演,于是 \( f[m] = \sum\limits_{i=1}^{m} s(m,i) * (-1)^{m-i} * [i=1] \),这里的 \( s(m,i) \) 是第一类斯特林数;
于是 \( f[m] = (m-1)! * (-1)^{m-1} \)
接下来问题就是求 \( t[i] \)
\( dfs \) 枚举集合划分,复杂度是 \( Bell[n] \) 的,可以接受;
枚举了集合划分后,这些集合之间一定不能有边,这与每张图的连边情况构成了一组线性方程组;
找出线性基有 \( cnt \) 个,那么 \( s-cnt \) 张图的使用是不受限制的,换句话说,即使随便使用,构成一种情况,也可以通过线性基的那些图调整成集合间没有连边的情况;
所以 \( t[集合数] \) 加上 \( 2^{s-cnt} \)
不用数组而用一个 long long 整数,再预处理2的整数次幂,可以把时间优化到bzoj上的一般水平囧。
代码如下:
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
typedef long long ll;
int s,n,m,cnt,id[][],col[],jc[],t[];
bool sid[][],vis[];
ll f[],a[],bin[];
char ch[];
ll pw(ll a,int b)
{
ll ret=;
for(;b;b>>=,a=a*a)if(b&)ret=ret*a;
return ret;
}
void add(int x)
{
cnt++; a[cnt]=;
for(int i=;i<=s;i++)
if(sid[i][x])a[cnt]|=bin[i-];//G[i]->ed[x]
}
int cal()
{
int num=;
memset(vis,,sizeof vis);
for(int i=;i<=cnt;i++)
for(int j=;j<=s;j++)
{
if(!(bin[j-]&a[i]))continue;
if(vis[j])a[i]^=a[t[j]];
else {num++,vis[j]=,t[j]=i; break;}//
}
return s-num;
}
void dfs(int x,int cr)
{
if(x==n+)
{
cnt=;
for(int i=;i<=n;i++)
for(int j=i+;j<=n;j++)
if(col[i]!=col[j])add(id[i][j]);
f[cr]+=pw(,cal());
return;
}
for(int i=;i<=cr;i++)col[x]=i,dfs(x+,cr),col[x]=;
col[x]=cr+; dfs(x+,cr+);
col[x]=;
}
void init()
{
jc[]=;
for(int i=;i<=n;i++)jc[i]=jc[i-]*i;
bin[]=;
for(int i=;i<=s;i++)bin[i]=bin[i-]+bin[i-];
}
int main()
{
scanf("%d",&s);
for(int i=;i<=s;i++)
{
scanf("%s",ch+); m=strlen(ch+);
for(int j=;j<=m;j++)sid[i][j]=ch[j]-'';
}
while(n*(n-)/<m)n++;
for(int i=,tmp=;i<=n;i++)
for(int j=i+;j<=n;j++)id[i][j]=id[j][i]=++tmp;//id[j][i]
init();
dfs(,);
ll ans=;
for(int i=;i<=n;i++)
ans+=(i&?:-)*jc[i-]*f[i];
printf("%lld\n",ans);
return ;
}
bzoj 4671 异或图 —— 容斥+斯特林反演+线性基的更多相关文章
- bzoj 4671 异或图——容斥+斯特林反演+线性基
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=4671 考虑计算不是连通图的方案,乘上容斥系数来进行容斥. 可以枚举子集划分(复杂度是O(Be ...
- 【bzoj4671】异或图(容斥+斯特林反演+线性基)
传送门 题意: 给出\(s,s\leq 60\)张图,每张图都有\(n,n\leq 10\)个点. 现在问有多少个图的子集,满足这些图的边"异或"起来后,这张图为连通图. 思路: ...
- BZOJ4671 异或图 斯特林反演+线性基
题目传送门 https://lydsy.com/JudgeOnline/problem.php?id=4671 题解 半年前刚学计数的时候对这道题怀着深深的景仰,现在终于可以来做这道题了. 类似于一般 ...
- BZOJ 4671 异或图 | 线性基 容斥 DFS
题面 Description 定义两个结点数相同的图 G1 与图 G2 的异或为一个新的图 G, 其中如果 (u, v) 在 G1 与 G2 中的出现次数之和为 1, 那么边 (u, v) 在 G 中 ...
- BZOJ4671 异或图(容斥+线性基)
题意 定义两个结点数相同的图 \(G_1\) 与图 \(G_2\) 的异或为一个新的图 \(G\) ,其中如果 \((u, v)\) 在 \(G_1\) 与 \(G_2\) 中的出现次数之和为 \(1 ...
- [BZOJ 4671]异或图
Description 题库链接 给定 \(s\) 个结点数相同且为 \(n\) 的图 \(G_1\sim G_s\) ,设 \(S = \{G_1, G_2,\cdots , G_s\}\) ,问 ...
- HDU 2841 容斥 或 反演
$n,m <= 1e5$ ,$i<=n$,$j<=m$,求$(i⊥j)$对数 /** @Date : 2017-09-26 23:01:05 * @FileName: HDU 284 ...
- 【题解】[HAOI2018]染色(NTT+容斥/二项式反演)
[题解][HAOI2018]染色(NTT+容斥/二项式反演) 可以直接写出式子: \[ f(x)={m \choose x}n!{(\dfrac 1 {(Sx)!})}^x(m-x)^{n-Sx}\d ...
- 【BZOJ】4671: 异或图
题解 写完之后开始TTTTTTT--懵逼 这道题我们考虑一个东西叫容斥系数啊>< 这个是什么东西呢 也就是\(\sum_{i = 1}^{m}\binom{m}{i}f_{i} = [m ...
随机推荐
- SpringBoot启动流程分析(四):IoC容器的初始化过程
SpringBoot系列文章简介 SpringBoot源码阅读辅助篇: Spring IoC容器与应用上下文的设计与实现 SpringBoot启动流程源码分析: SpringBoot启动流程分析(一) ...
- ServletContext读取配置文件
package servlet; import java.io.FileInputStream;import java.io.IOException;import java.io.InputStrea ...
- C++常用强制类型转换
1.static_cast 最常用的类型转换符,在正常状况下的类型转换,如把int转换成float,如: int i; float f; f=(float)i; 或者 f=static_cast(i) ...
- linux中MACHINE_START&END在9g10ek上实现
在linux的板卡初始化文件中有machine的相关定义 //arch/arm/mach-at91/board-sam9261ek.c MACHINE_START(AT91SAM9G10EK, &qu ...
- LeetCode108_Convert SortedArray to BinarySearchTree(将有序数组转成二叉排序树) Java题解
题目: Given an array where elements are sorted in ascending order, convert it to a height balanced BST ...
- mysql数据库常用语句系列
mysql查询某个字段长度 一般查询语句:SELECT `lcontent` FROM `caiji_ym_liuyan` 查询数据: 有些时候需要查询某个字段的长度为多少时候才显示数据: SQL ...
- IIS 配置错误:不能在此路径中使用此配置节。如果在父级别上锁定了该节,便会出现这种情况。 HTTP 错误 500.19
因为 IIS 7 采用了更安全的 web.config 管理机制,默认情况下会锁住配置项不允许更改.运行命令行 %windir%\system32\inetsrv\appcmd unlock conf ...
- EasyNVR+EasyDSS实现简单套路的RTMP、微信直播、录像、回放方案
安防领域HLS直播问题探讨 近期外出交流比较多,在之前的一篇博客<一种流量成本节省60%以上的手机直播微信直播H5直播幼儿园直播方案>我们说到了一种模式,就是当我们在做最近火热的幼儿园直播 ...
- 我的Android进阶之旅------>Android图片处理(Matrix,ColorMatrix)
本文转载于:http://www.cnblogs.com/leon19870907/articles/1978065.html 在编程中有时候需要对图片做特殊的处理,比如将图片做出黑白的,或者老照片的 ...
- ABAP upload file(*.txt *.csv *.xls)
转自:http://blog.csdn.net/jy00873757/article/details/8534492 在SAP我们经常会用到*.txt, *.csv, *.xls三种文件格式 *.TX ...