题目大意:

  传送门

题解:

  神题……Orz。

  首先正难则反。

  设$f_S$表示选取点集状态为s时,这部分图可以构成非强联通图的方案数。

  设$p_{S,i}$表示点集s缩点后有i个入度为0点的方案数,保证$i<|S|$。

  设$e[S,T]$表示从S集合到T集合的边数。

  很显然有

  好吧,并不显然……还是来解释一下……

  考虑求$f_S$,我们知道缩点后必然会有一些点环的入度为0,但数量并不确定,我们强制性的让一部分图构成一部分缩点后为i个入度为0的子图。然后将这部分图随意连向剩余子图,至于剩余子图内部也可以随便连。但是显然当$T==S$时,我们需要让被选择的图缩点后至少要有2个入度为0的点。

  然后这个东西显然(这次是真的)是会重的,为了去重,我们使用容斥原理,这样我们就得到了上面这玩意。

  问题是这东西怎么求……

  我们设

  值得注意的会发现$g_S$和其他子图不太一样(缩点后有至少两个入度为0的点?)……

  我们先想这东西怎么搞……

  先假设已经知道$T\neq S$的$g$值。

  那么考虑当我们枚举到$T==S$时,由于我们已经将两部分图中连边的方案容斥完了(因为$T==S$时,T不可能再向$S-T$连边)。那么还剩下的就是两部分图中不连边的方案还没有容斥完。(请注意是两部分)

  为了满足容斥,$g_S$此时应该记录的是分成若干个联通块以后没有边的方案数。

  这样的话就会导致一个问题$g_S$对于$f_S$和$f_S+I,I\cap S \neq |I|$的意义是不一样的。但$S+I$太遥远了,我们先考虑对于S的意义该怎么算。

  我们还是可以枚举$S$的子集,我们会得到$g_S=-\sum_T g_T * (2^{e[S-T,S-T]}-f_{S-T})$即我们强制一部图为一个强联通分量,另外一部分图我们使其数量任意。为了使其构成我们想要的意义,那么我们强行不让他们连边。这样我们$S$相对与$T$就多了一个强联通分量,故要乘上$-1$。

  但这样会出现一个问题,就是我们必然会算重。比如$g_T$中是包含缩成1个点的方案的,$S-T$我们又让它缩成了1个点,这样我们比如会重复计算。当然出重的不只这些。

  那么为了避免出现这种情况,同时枚举时必然是两个非空子集。那我们就强制让一个点划分到一部分子集里。这样我们就可以解决这个问题了。

  回来考虑$g_S$对$S+I$该怎么算,我们注意到他们之间的区别是当对于$S$时,我们要求分成至少两个强联通分量,而$S-T$时则可以只有1个,那么我们直接给$g_S$加上$2^{e[S,S]-f_S}$不就完事了。

  真难表述……(辣鸡linux没有仿宋字体,看得好难受

代码:

 1 #include "bits/stdc++.h"
 2
 3 using namespace std;
 4
 5 inline int read(){
 6     int s=0,k=1;char ch=getchar();
 7     while (ch<'0'|ch>'9') ch=='-'?k=-1:0,ch=getchar();
 8     while (ch>47&ch<='9') s=s*10+(ch^48),ch=getchar();
 9     return s*k;
10 }
11
12 const int N=20,M=1<<N,mod=1e9+7;
13
14 int n,m,S;
15 int edge[M],num[M],bin[N*N],f[M],g[M],e[M],redge[M],w[M],lgs[M];
16
17 int main(){
18     //freopen(".in","r",stdin);
19     //freopen("vio.out","w",stdout);
20     register int i,j,k,res;
21     n=read(),m=read();
22     for (i=1;i<=m;++i) {
23         j=read(),k=read();
24         edge[1<<j-1]^=1<<k-1;
25         redge[1<<k-1]^=1<<j-1;
26     }
27     for (i=bin[0]=1;i<=m;++i) j=(bin[i-1]<<1),j<mod?bin[i]=j:bin[i]=j-mod;
28
29     for (S=1<<n,i=1;i^S;++i) num[i]=num[i>>1]+(i&1);
30     for (i=1,lgs[0]=-1;i^S;++i) lgs[i]=lgs[i>>1]+1;
31     for (i=1;i^S;++i) j=bin[lgs[i]],e[i]=e[i^j]+num[redge[j]&(i^j)]+num[edge[j]&(i^j)];
32     for (i=1;i<S;++i) {
33         k=i&-i,res=i^k;
34         for (j=res&res-1;j;j=j-1&res) {
35             g[i]+=1ll*g[res^j]*(bin[e[j^k]]-f[j^k]+mod)%mod;
36             g[i]<mod?0:g[i]-=mod;
37         }
38         if (num[i]>1) g[i]+=g[res],g[i]<mod?0:g[i]-=mod;
39         g[i]=g[i]?mod-g[i]:0;
40         for (j=res;j;j=j-1&i) {
41             k=bin[lgs[i^j]];
42             w[i^j]=w[i^j^k]+num[redge[k]&j]-num[edge[k]&(i^j^k)];
43             f[i]+=1ll*bin[e[i^j]+w[i^j]]*g[j]%mod;
44             f[i]<mod?0:f[i]-=mod;
45         }
46         f[i]+=g[i];
47         f[i]<mod?0:f[i]-=mod;
48         g[i]+=(bin[e[i]]-f[i]+mod)%mod;
49         g[i]<mod?0:g[i]-=mod;
50     }
51     printf("%d\n",(bin[m]-f[S-1]+mod)%mod);
52     return 0;
53 }

转载于:https://www.cnblogs.com/Troywar/p/8879470.html

UOJ#37. 【清华集训2014】主旋律相关推荐

  1. 【uoj#37/bzoj3812】[清华集训2014]主旋律 状压dp+容斥原理

    题目描述 求一张有向图的强连通生成子图的数目对 $10^9+7$ 取模的结果. 题解 状压dp+容斥原理 设 $f[i]$ 表示点集 $i$ 强连通生成子图的数目,容易想到使用总方案数 $2^{sum ...

  2. [清华集训2014]主旋律

    题目 传送门 to UOJ 思路 好像思路都是靠 R a i n y B u n n y \sf RainyBunny RainyBunny 讲的,自己完全不会啊,哭了. 要求图是强连通的,这个很难直 ...

  3. [BZOJ3811][UOJ#36][清华集训2014]玛里苟斯(期望 + 线性基)

    Address BZOJ 3811 UOJ #36 Solution 看到异或,首先想到拆位 下面 xor ( A ) \text{xor}(A) xor(A) 表示子集 A A A 的异或和, b ...

  4. 【清华集训2014】Sum)(类欧几里得算法)

    [清华集训2014]Sum 然后本质上我们需要求解的就是那个带根号式子的奇偶性,然后我们发现这个式子很像是类欧几里得算法,求解一个斜率为无理数直线下的整点个数,然后我们直接对于一般形式求解,那么就是每 ...

  5. 清华集训2014 玛里苟斯

    清华集训2014 玛里苟斯 求子集异或和k次方的期望. 异或考虑按位算贡献. 对于\(K=1\),考虑异或和\(\frac{x}{2}\)就是答案. 证明简单来说就是,你可以先打一个概率\(dp\)分 ...

  6. 【清华集训 2014】玛里苟斯(组合计数 + 线性基)

    题目链接:[清华集训 2014]玛里苟斯 推荐博客:[BZOJ 3811]玛里苟斯:线性基(详细证明) 首先想到将kkk分类讨论. k=1" role="presentation& ...

  7. 玛里苟斯[清华集训2014 Day1]

    玛里苟斯[清华集训2014 Day1] 魔法之龙玛里苟斯最近在为加基森拍卖师的削弱而感到伤心,于是他想了一道数学题. S 是一个可重集合,S={a1,a2,-,an}. 等概率随机取 S 的一个子集  ...

  8. 【清华集训2014】【BZOJ3811】玛里苟斯

    Description 魔法之龙玛里苟斯最近在为加基森拍卖师的削弱而感到伤心,于是他想了一道数学题. S 是一个可重集合,S={a1,a2,-,an}. 等概率随机取 S 的一个子集 A={ai1,- ...

  9. UOJ37. 【清华集训2014】主旋律

    http://uoj.ac/problem/37 题解 题目是让我们求出有多少个边集可以使这张图强连通. 先补集转化一下,求这张图不强连通的方案数. 我们考虑这样的图缩完点之后的情况,既然不强连通,那 ...

最新文章

  1. GIT - 拉取其他仓库的某个分支的代码
  2. Asp.Net Core获取请求信息/获取请求地址
  3. 接口和一些抽象类的区别
  4. 如何避免贫穷和忙碌,在2018年你需要这样提升自己
  5. c语言程序设计项目化教程第二版,c语言程序设计下载
  6. SQL的主键和外键详解!
  7. GStreamer系列-基础概念
  8. 关于2022虎符pwn mva解决jmp rax无法反汇编的这么个事情
  9. 嵌入式linux:通过qemu模拟mini2440开发环境
  10. 把数字翻译成字符串(递归,动态规划)
  11. 压缩图片和改变图片图形
  12. 【单片机】【数码管】数码管显示
  13. 霸气牵手众多手机品牌商,苏宁手机蜜蜂节实力彰显行业影响力
  14. java调用银联支付接口开发,银联在线Java接口开发
  15. JVM StackOverFlowError
  16. 计算机专业的大学生必考证书,大学必考8大证书计算机
  17. 失传千年AE特效真经(一)
  18. pat乙级 1072 开学寄语 (20 分)C
  19. android去除root,RE管理器root权限彻底清除教程[图]
  20. 一分钟学会!PMP培训机构怎么选更好?

热门文章

  1. Hadoop Yarn公平调度器的特点、缺额、DRF策略
  2. 【收藏】部署Kubernetes(k8s)时,为什么要关闭swap、selinux、防火墙?
  3. spark Docker镜像构建及push脚本
  4. kylin分析引擎:运行原理、维度和Cube等名词解释、核心算法
  5. 【视频】vue指令之@click及其stop修饰符
  6. 使用final关键字修饰一个变量时,是引用不能变,还是引用的对象不能变?
  7. RabbitMQ消费消息幂等性问题
  8. python rm 条件_删除文件 (rm)
  9. 11寸笔记本电脑推荐_3000-20000元高性价比笔记本电脑推荐 含CPU天梯图、显卡天梯图 2020年11月更新...
  10. Idea中启动tomcat服务,提示缺少一个tcnative-1.dll文件