传送门

第一眼容斥,然后我就死活容不出来了……

记\(f_i\)为点集\(i\)中的点强联通的方案数,那么就是总的方案数减去使\(i\)不连通的方案数

如果\(i\)不连通的话,我们可以枚举缩点之后拓扑序最小(也就是入度为\(0\))的强连通分量,然而这种强联通分量可能不止一个,需要容斥,不难发现这里的容斥系数在强联通分量个数为奇数时为正,为偶数时为负(也就是强联通分量为奇数时要减掉方案数,为偶数时要加上方案数)

设\(g_i\)为点集\(i\)中形成奇数个强连通分量的方案数\(-\)形成偶数个强联通分量的方案数,设这个点集中编号最小的点为\(x\),我们枚举与\(x\)在同一强连通分量中的点集\(j\),容斥可得\(g_i=-\sum_{j\subset x}f_{i-j}g_j\),注意这里不包含\(g\)只有一个强联通分量的方案数

然后我们钦定一下入度为\(0\)的强联通分量\(j\),则有转移\(f_i=2^{sum_i}-\sum\limits_{j\subset i}2^{sum_i-w_j}\times g_j\),其中\(sum[i]\)为点集\(i\)中的边数,\(w_j\)为\(i\)向\(j\)连边的数目,就是说这些钦定的点连不出来

最后把\(f_i\)给\(g_i\)加上去,代表\(g\)只有一个强联通分量的方案数

//minamoto
#include<bits/stdc++.h>
#define R register
#define fp(i,a,b) for(R int i=a,I=b+1;i<I;++i)
#define fd(i,a,b) for(R int i=a,I=b-1;i>I;--i)
#define go(u) for(int i=head[u],v=e[i].v;i;i=e[i].nx,v=e[i].v)
using namespace std;
char buf[1<<21],*p1=buf,*p2=buf;
inline char getc(){return p1==p2&&(p2=(p1=buf)+fread(buf,1,1<<21,stdin),p1==p2)?EOF:*p1++;}
int read(){
R int res,f=1;R char ch;
while((ch=getc())>'9'||ch<'0')(ch=='-')&&(f=-1);
for(res=ch-'0';(ch=getc())>='0'&&ch<='9';res=res*10+ch-'0');
return res*f;
}
char sr[1<<21],z[20];int C=-1,Z=0;
inline void Ot(){fwrite(sr,1,C+1,stdout),C=-1;}
void print(R int x){
if(C>1<<20)Ot();if(x<0)sr[++C]='-',x=-x;
while(z[++Z]=x%10+48,x/=10);
while(sr[++C]=z[Z],--Z);sr[++C]='\n';
}
const int N=(1<<15)+5,P=1e9+7;
inline int add(R int x,R int y){return x+y>=P?x+y-P:x+y;}
inline int dec(R int x,R int y){return x-y<0?x-y+P:x-y;}
inline int mul(R int x,R int y){return 1ll*x*y-1ll*x*y/P*P;}
int ksm(R int x,R int y){
R int res=1;
for(;y;y>>=1,x=mul(x,x))if(y&1)res=mul(res,x);
return res;
}
int in[N],out[N],sz[N],sum[N],w[N],f[N],g[N],bin[225];
int n,m,u,v,lim,S;
void dfs(int i,int j){
if(i&(j-1))dfs(i,i&(j-1));
w[j]=w[j-(j&-j)]+sz[in[j&-j]&i];
}
int main(){
// freopen("testdata.in","r",stdin);
n=read(),m=read(),bin[0]=1,lim=(1<<n);
fp(i,1,m)bin[i]=mul(bin[i-1],2);
fp(i,1,m)u=read()-1,v=read()-1,in[1<<v]|=(1<<u),out[1<<u]|=(1<<v);
fp(i,1,lim){
S=i-(i&-i),sz[i]=sz[S]+1,sum[i]=sum[S]+sz[in[i&-i]&i]+sz[out[i&-i]&i],f[i]=bin[sum[i]];
dfs(i,i);
for(R int j=S;j;j=(j-1)&S)g[i]=dec(g[i],mul(f[i^j],g[j]));
for(R int j=i;j;j=(j-1)&i)f[i]=dec(f[i],mul(bin[sum[i]-w[j]],g[j]));
g[i]=add(g[i],f[i]);
}
printf("%d\n",f[lim-1]);
return 0;
}

uoj#37. 【清华集训2014】主旋律(状压dp+容斥)的更多相关文章

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

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

  2. BZOJ 3812 主旋律 (状压DP+容斥) + NOIP模拟赛 巨神兵(obelisk)(状压DP)

    这道题跟另一道题很像,先看看那道题吧 巨神兵(obelisk) 题面 欧贝利斯克的巨神兵很喜欢有向图,有一天他找到了一张nnn个点mmm条边的有向图.欧贝利斯克认为一个没有环的有向图是优美的,请问这张 ...

  3. [清华集训2015 Day1]主旋律-[状压dp+容斥]

    Description Solution f[i]表示状态i所代表的点构成的强连通图方案数. g[i]表示状态i所代表的的点形成奇数个强连通图的方案数-偶数个强连通图的方案数. g是用来容斥的. 先用 ...

  4. codeforces 342D Xenia and Dominoes(状压dp+容斥)

    转载请注明出处: http://www.cnblogs.com/fraud/          ——by fraud D. Xenia and Dominoes Xenia likes puzzles ...

  5. bzoj2669 [cqoi2012]局部极小值 状压DP+容斥

    题目传送门 https://lydsy.com/JudgeOnline/problem.php?id=2669 题解 可以发现一个 \(4\times 7\) 的矩阵中,有局部最小值的点最多有 \(2 ...

  6. 一本通 1783 矩阵填数 状压dp 容斥 计数

    LINK:矩阵填数 刚看到题目的时候感觉是无从下手的. 可以看到有n<=2的点 两个矩形. 如果只有一个矩形 矩形外的方案数容易计算考虑 矩形内的 必须要存在x这个最大值 且所有值<=x. ...

  7. P3160 [CQOI2012]局部极小值 题解(状压DP+容斥)

    题目链接 P3160 [CQOI2012]局部极小值 双倍经验,双倍快乐 解题思路 存下来每个坑(极小值点)的位置,以这个序号进行状态压缩. 显然,\(4*7\)的数据范围让极小值点在8个以内(以下示 ...

  8. HDU 5838 (状压DP+容斥)

    Problem Mountain 题目大意 给定一张n*m的地图,由 . 和 X 组成.要求给每个点一个1~n*m的数字(每个点不同),使得编号为X的点小于其周围的点,编号为.的点至少大于一个其周围的 ...

  9. bzoj2560串珠子 状压dp+容斥(?)

    2560: 串珠子 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 515  Solved: 348[Submit][Status][Discuss] ...

随机推荐

  1. Java基础教程:HashTable与HashMap比较

    Java基础教程:HashTable与HashMap比较 1.  关于HashMap的一些说法: a)  HashMap实际上是一个“链表散列”的数据结构,即数组和链表的结合体.HashMap的底层结 ...

  2. systemclock sleep 睡眠

  3. node版本管理工具 -- nvm安装与使用

    新老项目维护时node环境切换麻烦怎么办? 不用担心,有了nvm ,一个命令就能切换node版本. 首先需要安装nvm工具,进入下载地址. 下载之后安装nvm. nvm安装之后还需要配置两个环境变量( ...

  4. Git core objects

    Git core objects Core objects in git blob object tree object commit object Git low level commands gi ...

  5. poj2965 The Pilots Brothers' refrigerator —— 技巧性

    题目链接:http://poj.org/problem?id=2965 题解:自己想到的方法是枚举搜索,结果用bfs和dfs写都超时了.网上拿别人的代码试一下只是刚好不超时的,如果自己的代码在某些方面 ...

  6. Contiki 2.7 Makefile 文件(四)

    3.第三部分 这里我们假设TARGET为native (1) OBJECTDIR = obj_$(TARGET) LOWERCASE = -abcdefghijklmnopqrstuvwxyz UPP ...

  7. freemaker开发

    推荐书籍 百度云盘 密码: c3m9 1. 前言 本书为<FreeMarker 2.3.19 中文版手册>,包含了freemarker开发得方方面面,可以作为开发freemarker的字典 ...

  8. Mybatis 批量删除 单引号

    MySQL效果: ' AND NAME IN ('policycustom1.xmlx','policycustom.xmlx','policycustom1.xmlx','policycustom. ...

  9. 安装.NET Core 3.0预览版后VS项目目标框架中不显示的解决方法

    下载了微软在GitHub上的cSharpSamples项目后发现其中一些项目使用框架为.NET Core3.0,就下载了.NET Core3.0,但发现项目依然不可用,编译时提示如下 当前 .net ...

  10. BZOJ2726:任务安排(DP+斜率优化+二分)

    机器上有N个需要处理的任务,它们构成了一个序列.这些任务被标号为1到N,因此序列的排列为1,2,3...N.这N个任务被分成若干批,每批包含相邻的若干任务.从时刻0开始,这些任务被分批加工,第i个任务 ...