http://uoj.ac/problem/37

题解

题目是让我们求出有多少个边集可以使这张图强连通。

先补集转化一下,求这张图不强连通的方案数。

我们考虑这样的图缩完点之后的情况,既然不强连通,那么它就是个\(DAG\)。

回顾一下有向图\(DAG\)计数的方法。

每次新加入一层入度为\(0\)的点,向之前的点连边。但这时我们不能保证我们枚举的点就是全部入度为\(0\)的,所以我们还需要容斥。

\[f[S]=\sum_{T\subset S}(-1)^{|T|}f[S-T]2^{edge(S,S-T)}
\]

再次观察到容斥系数之和点数的奇偶性有关,因为此时我们的每个点已经是一个强连通分量了。

所以我们设\(deg[s]\)表示\(s\)集合是一个\(DAG\),如果求出了这个数组,那么我们用全集减去它就是答案了。

我们再设\(D[s]\)表示\(s\)集合被划分为奇数个强连通分量的方案数,\(S[s]\)表示划分为偶数个强连通分量的方案数。

转移:

\[dag[S]=\sum_{T\subset S}(D[S]-S[S])*2^{edge(T,S-T)+edge(S-T,S-T)}
\]

最后加上自己连自己的方案数是因为我们的容斥系数已经弄好了,只需要让\(S-T\)缩完点之后成为一个\(DAG\)就行了,所以合法的边集是全集。

我们最后的答案\(f[s]\)表示\(s\)集合强连通的方案数,\(D\)和\(S\)的转移有:

\[D[S]=\sum_{T\subset S}f[T]*S[S-T]
\]

\[S[S]=\sum_{T\subset S}f[T]*D[S-T]
\]

代码

#include<bits/stdc++.h>
#define N 16
#define M 225
using namespace std;
typedef long long ll;
const int mod=1e9+7;
int n,m;
ll D[1<<N],S[1<<N],ci[N*N],f[1<<N];
bitset<M>in[1<<N],out[1<<N];
inline void MOD(ll &x){x=x>=mod?x-mod:x;}
inline ll rd(){
ll x=0;char c=getchar();bool f=0;
while(!isdigit(c)){if(c=='-')f=1;c=getchar();}
while(isdigit(c)){x=(x<<1)+(x<<3)+(c^48);c=getchar();}
return f?-x:x;
}
inline int calc(int s,int t){return (out[s]&in[t]).count();}
int main(){
n=rd();m=rd();
int u,v;
int maxn=(1<<n)-1;
ci[0]=1;
for(int i=1;i<=n*n;++i)ci[i]=ci[i-1]*2%mod;
for(int i=1;i<=m;++i){
u=rd();v=rd();
for(int j=1;j<=maxn;++j){
if(j&(1<<u-1))out[j][i]=1;
if(j&(1<<v-1))in[j][i]=1;
}
}
S[0]=1;
for(int i=1;i<=maxn;++i){
f[i]=ci[calc(i,i)];
for(int s=(i-1)&i;s;s=(s-1)&i){
MOD(f[i]=(f[i]-(D[s]-S[s])*ci[calc(s,i-s)+calc(i-s,i-s)]%mod+mod));
if((s&(i&-i))==0)continue;
MOD(D[i]+=f[s]*S[i-s]%mod);
MOD(S[i]+=f[s]*D[i-s]%mod);
}
MOD(f[i]=(f[i]-(D[i]-S[i]))%mod+mod);
MOD(D[i]+=f[i]);
}
cout<<f[maxn];
return 0;
}

UOJ37. 【清华集训2014】主旋律的更多相关文章

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

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

  2. BZOJ3812 清华集训2014 主旋律

    直接求出强联通生成子图的数量较难,不妨用所有生成子图的数量减去非强联通的. 非强联通生成子图在所点后满足编号最小的点所在的强联通分量不是全集. 由于$n$很小,我们可以考虑状态压缩. 对于点集$S$, ...

  3. 【UOJ#37】 [清华集训2014] 主旋律

    题目链接 题目描述 给定一张强联通图,求有多少种边的存在情况满足图依然强联通. \(n\leq15\) Sol 首先正难则反,考虑用总数减去不强联通的. 考虑一张不强联通的图,缩点后一定是一个 DAG ...

  4. uoj 41 【清华集训2014】矩阵变换 婚姻稳定问题

    [清华集训2014]矩阵变换 Time Limit: 20 Sec  Memory Limit: 256 MB 题目连接 http://uoj.ac/problem/41 Description 给出 ...

  5. AC日记——【清华集训2014】奇数国 uoj 38

    #38. [清华集训2014]奇数国 思路: 题目中的number与product不想冲: 即为number与product互素: 所以,求phi(product)即可: 除一个数等同于在模的意义下乘 ...

  6. UOJ#46. 【清华集训2014】玄学

    传送门 分析 清华集训真的不是人做的啊嘤嘤嘤 我们可以考虑按操作时间把每个操作存进线段树里 如果现在点x正好使一个整块区间的右端点则更新代表这个区间的点 我们不难发现一个区间会因为不同的操作被分成若干 ...

  7. 清华集训2014 sum

    清华集训2014sum 求\[∑_{i=1}^{n}(-1)^{⌊i√r⌋}\] 多组询问,\(n\leq 10^9,t\leq 10^4, r\leq 10^4\). 吼题解啊 具体已经讲得很详细了 ...

  8. 清华集训2014 day1 task2 主旋律

    题目 这可算是一道非常好的关于容斥原理的题了. 算法 好吧,这题我毫无思路,直接给正解. 首先,问题的正面不容易求,那么就求反面吧: 有多少种添加边的方案,使得这个图是DAG图(这里及以下所说的DAG ...

  9. UOJ#37. 【清华集训2014】主旋律

    题目大意: 传送门 题解: 神题……Orz. 首先正难则反. 设$f_S$表示选取点集状态为s时,这部分图可以构成非强联通图的方案数. 设$p_{S,i}$表示点集s缩点后有i个入度为0点的方案数,保 ...

随机推荐

  1. C语言第十一周作业

        这个作业属于哪个课程 C语言程序设计II 这个作业要求在哪里 https://edu.cnblogs.com/campus/zswxy/computer-scienceclass3-2018/ ...

  2. linux中防止黑客进入单用户模式进行强制修改密码窃取数据

    如何防止别人恶意通过单用户系统破解root密码,进入系统窃取数据? 给grub加密,不让别人通过grub进入单用户. 当前系统:CentOS Linux release 7.6.1810 (Core) ...

  3. 拦截器Interceptor和过滤器Filter的区别

    (1)过滤器(Filter):当你有一堆东西的时候,你只希望选择符合你要求的某一些东西.定义这些要求的工具,就是过滤器.(理解:就是一堆字母中取一个B) (2)拦截器(Interceptor):在一个 ...

  4. [BZOJ4444] [Luogu 4155] [LOJ 2007] [SCOI2015]国旗计划(倍增)

    [BZOJ4444] [Luogu 4155] [LOJ 2007] [SCOI2015]国旗计划(倍增) 题面 题面较长,略 分析 首先套路的断环为链.对于从l到r的环上区间,若l<=r,我们 ...

  5. Django @csrf_exempt不能在类视图中工作(Django @csrf_exempt not working in class View)

    我在Django 1.9中有一个使用SessionMiddleware的应用程序.我想在同一个项目中为这个应用程序创建一个API,但是在做一个POST请求时,它不能使用@csrf_exempt注释. ...

  6. luogu P5337 [TJOI2019]甲苯先生的字符串

    传送门 所以这题和字符串有什么关系 首先可以写出dp,\(f_{i,j}\)表示前\(i\)位,最后一个字符是\(j\)的方案,转移枚举下一位,只要不在大串中前后相邻即可.然后矩乘优化即可 // lu ...

  7. Spark-Streaming获取kafka数据的两种方式:Receiver与Direct的方式

    简单理解为:Receiver方式是通过zookeeper来连接kafka队列,Direct方式是直接连接到kafka的节点上获取数据 Receiver 使用Kafka的高层次Consumer API来 ...

  8. Vue-Quill-Editor 富文本编辑器

    通俗来说:富文本,就是比较丰富的文本编辑器.普通的框只能输入文字,而富文本还能给文字加颜色样式等. 富文本编辑器有很多,例如:KindEditor.Ueditor.但并不原生支持vue 但是我们今天要 ...

  9. java中使用SimpleDateFormat实现字符串和日期的相互转换

    java中使用SimpleDateFormat实现字符串和日期的相互转换 import java.text.ParseException; import java.text.SimpleDateFor ...

  10. iOS app被拒整理

    作者:Leon链接:http://www.zhihu.com/question/33191327/answer/71421736来源:知乎著作权归作者所有.商业转载请联系作者获得授权,非商业转载请注明 ...