题目: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 异或图 —— 容斥+斯特林反演+线性基的更多相关文章

  1. bzoj 4671 异或图——容斥+斯特林反演+线性基

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=4671 考虑计算不是连通图的方案,乘上容斥系数来进行容斥. 可以枚举子集划分(复杂度是O(Be ...

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

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

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

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

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

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

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

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

  6. [BZOJ 4671]异或图

    Description 题库链接 给定 \(s\) 个结点数相同且为 \(n\) 的图 \(G_1\sim G_s\) ,设 \(S = \{G_1, G_2,\cdots , G_s\}\) ,问 ...

  7. HDU 2841 容斥 或 反演

    $n,m <= 1e5$ ,$i<=n$,$j<=m$,求$(i⊥j)$对数 /** @Date : 2017-09-26 23:01:05 * @FileName: HDU 284 ...

  8. 【题解】[HAOI2018]染色(NTT+容斥/二项式反演)

    [题解][HAOI2018]染色(NTT+容斥/二项式反演) 可以直接写出式子: \[ f(x)={m \choose x}n!{(\dfrac 1 {(Sx)!})}^x(m-x)^{n-Sx}\d ...

  9. 【BZOJ】4671: 异或图

    题解 写完之后开始TTTTTTT--懵逼 这道题我们考虑一个东西叫容斥系数啊>< 这个是什么东西呢 也就是\(\sum_{i = 1}^{m}\binom{m}{i}f_{i} = [m ...

随机推荐

  1. Android----SharedPreferences(存储数据)

    SharedPreferences详解 我们在开发软件的时候,常需要向用户提供软件参数设置功能,例如我们常用的微信,用户可以设置是否允许陌生人添加自己为好友.对于软件配置参数的保存,如果是在windo ...

  2. 【Java】Spring Web MVC注意事项

    本文内容可能是书上没有的,至少是<Java Web整合开发实践>这本书上没有的.这是初学Spring的笔者走过的弯路,谨记以自勉. 这两天学习Spring WebMVC,照着书依葫芦画瓢写 ...

  3. HDFS源码分析心跳汇报之数据块汇报

    在<HDFS源码分析心跳汇报之数据块增量汇报>一文中,我们详细介绍了数据块增量汇报的内容,了解到它是时间间隔更长的正常数据块汇报周期内一个smaller的数据块汇报,它负责将DataNod ...

  4. PowerBuilder -- 日期

    #PB自带日期相关函数 Date(...), DateTime(...), RelativeDate(...), Year(...), Month(...), Day(...), DaysAfter( ...

  5. insert小细节,大问题

    今天现场报流程无法查看,已查看流程表中没有数据了.昨天有运行过删除垃圾数据的脚步.大致过程是: create table bak_test a as select * from test; creat ...

  6. java jdbc oracle ORA-01795: 列表中的最大表达式数为 1000

    在操作SQL中存在In的数量如果超过1000条会提示   ORA-01795: 列表中的最大表达式数为 1000 归纳有几种方式出现的: 第一种是:我在上一个 [jdbc 同时执行 查询和删除操]作中 ...

  7. Android 红色小圆球提示气泡 BadgeView

    今天给大家分享两个实用有简单的一个小圆球提示气泡: BadgeView 参考地址: https://github.com/qstumn/BadgeView;       个人地址:http://git ...

  8. Error -27728: Step download timeout (120 seconds)的解决方法(转)

    LR中超时问题解决方法 超时错误在LoadRunner录制Web协议脚本回放时超时经常出现. 现象1:Action.c(16): Error -27728: Step download timeout ...

  9. Unix环境高级编程—进程控制(三)

    一.解释器文件 解释器文件属于文本文件,起始行形式为: #! pathname[optional-argument] 我们创建一个只有一行的文件如下: #!/home/webber/test/echo ...

  10. Pentaho BIServer Community Edtion 6.1 使用教程 第三篇 发布和调度Kettle(Data Integration) 脚本 Job & Trans

    Pentaho BIServer Community Edtion 6.1 集成了 Kettle 组件,可以运行Kettle 程序脚本.但由于Kettle没有直接发布到 BIServer-ce 服务的 ...