题目: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上的一般水平囧。

代码如下:

  1. #include<iostream>
  2. #include<cstdio>
  3. #include<cstring>
  4. #include<algorithm>
  5. using namespace std;
  6. typedef long long ll;
  7. int s,n,m,cnt,id[][],col[],jc[],t[];
  8. bool sid[][],vis[];
  9. ll f[],a[],bin[];
  10. char ch[];
  11. ll pw(ll a,int b)
  12. {
  13. ll ret=;
  14. for(;b;b>>=,a=a*a)if(b&)ret=ret*a;
  15. return ret;
  16. }
  17. void add(int x)
  18. {
  19. cnt++; a[cnt]=;
  20. for(int i=;i<=s;i++)
  21. if(sid[i][x])a[cnt]|=bin[i-];//G[i]->ed[x]
  22. }
  23. int cal()
  24. {
  25. int num=;
  26. memset(vis,,sizeof vis);
  27. for(int i=;i<=cnt;i++)
  28. for(int j=;j<=s;j++)
  29. {
  30. if(!(bin[j-]&a[i]))continue;
  31. if(vis[j])a[i]^=a[t[j]];
  32. else {num++,vis[j]=,t[j]=i; break;}//
  33. }
  34. return s-num;
  35. }
  36. void dfs(int x,int cr)
  37. {
  38. if(x==n+)
  39. {
  40. cnt=;
  41. for(int i=;i<=n;i++)
  42. for(int j=i+;j<=n;j++)
  43. if(col[i]!=col[j])add(id[i][j]);
  44. f[cr]+=pw(,cal());
  45. return;
  46. }
  47. for(int i=;i<=cr;i++)col[x]=i,dfs(x+,cr),col[x]=;
  48. col[x]=cr+; dfs(x+,cr+);
  49. col[x]=;
  50. }
  51. void init()
  52. {
  53. jc[]=;
  54. for(int i=;i<=n;i++)jc[i]=jc[i-]*i;
  55. bin[]=;
  56. for(int i=;i<=s;i++)bin[i]=bin[i-]+bin[i-];
  57. }
  58. int main()
  59. {
  60. scanf("%d",&s);
  61. for(int i=;i<=s;i++)
  62. {
  63. scanf("%s",ch+); m=strlen(ch+);
  64. for(int j=;j<=m;j++)sid[i][j]=ch[j]-'';
  65. }
  66. while(n*(n-)/<m)n++;
  67. for(int i=,tmp=;i<=n;i++)
  68. for(int j=i+;j<=n;j++)id[i][j]=id[j][i]=++tmp;//id[j][i]
  69. init();
  70. dfs(,);
  71. ll ans=;
  72. for(int i=;i<=n;i++)
  73. ans+=(i&?:-)*jc[i-]*f[i];
  74. printf("%lld\n",ans);
  75. return ;
  76. }

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. matlab2016b-linux版本在ubutu16.04x64上面不能打开摄像头的处理方法

    this  can  not  work.    need  find  other way.   ================================================== ...

  2. gulp入门-压缩js/css文件(windows)

    类似于grunt,都是基于Node.js的前端构建工具.不过gulp压缩效率更高. 工具/原料 nodejs/npm 方法/步骤 首先要确保pc上装有node,然后在global环境和项目文件中都in ...

  3. HTML5 2D平台游戏开发#2跳跃与二段跳

    在上一篇<Canvas制作时间与行为可控的sprite动画>中已经实现了角色的左右移动,本篇继续实现角色的一系列动作之一:跳跃.先来看看最终效果: 要实现跳跃,必须模拟垂直方向的速度和重力 ...

  4. 小程序踩坑之不同屏幕下动态改变translate值

    案例还原 小程序做一个进度条,可以通过拽转控制进度 那么肯定有一个进度条,不过小程序自己会做适配宽高 6s下这个div的width 是250 6splus就是276 但是问题来了,我拖拽用的是tran ...

  5. 修改zend studio字符集

    zend studio是一款编辑PHP的很好的工具,但是它的默认字符集是GBK,如何修改成UTF-8呢? 一.修改整个编辑器的编码 其实很简单,如果你做的每一个项目都是固定的某一个字符集(如UTF-8 ...

  6. Windows下Nginx+Web.py+FastCGI服务搭建

    在搭建之前,有必要了解下什么是fastcgi,但鉴于我自己也不大了解,这里就不搬门弄斧了,请参考各种百科和官网资料. 1.资源下载 python下载地址:戳这里webpy下载地址:戳这里flup下载地 ...

  7. urllib与urllib2的学习总结(python2.7.X): python urllib与urllib2

    https://www.cnblogs.com/wly923/archive/2013/05/07/3057122.html

  8. 【BZOJ2096】[Poi2010]Pilots 双指针+单调队列

    [BZOJ2096][Poi2010]Pilots Description Tz又耍畸形了!!他要当飞行员,他拿到了一个飞行员测试难度序列,他设定了一个难度差的最大值,在序列中他想找到一个最长的子串, ...

  9. client网络优化方法

    减小图片大小(使用WebP格式的图片)  大部分的Facebook应用数据都是图片,因此降低图片的大小就能够较少数据的下载量.从而加快下载速度,这一点在高延迟的网络环境下很重要.Facebook返回给 ...

  10. 近200篇机器学习&深度学习资料分享【转载】

    编者按:本文收集了百来篇关于机器学习和深度学习的资料,含各种文档,视频,源码等.而且原文也会不定期的更新,望看到文章的朋友能够学到更多. <Brief History of Machine Le ...