BZOJ3812 清华集训2014 主旋律

直接求出强联通生成子图的数量较难,不妨用所有生成子图的数量减去非强联通的。
非强联通生成子图在所点后满足编号最小的点所在的强联通分量不是全集。
由于$n$很小,我们可以考虑状态压缩。
对于点集$S$,我们钦定一个它的子集$K$入度数为$0$,希望除去$K$以外的$S$度数不为$0$
设钦定$K$的度数为$0$其他随意的方案数为$H_{S,K}=2^{sum_S-sum_{\{S^K\}\rightarrow\{k\}}}$
设$G_S$表示$S$分为奇数个强联通分量的方案数减去分为偶数个强联通分量的方案数。
设$F_S$表示$S$的强联通生成子图数。
$G_S=-\sum\limits_{K\subset S}F_{S-K}\cdot G_K$
$F_S=2^{sum_S}-\sum\limits_{K\subset S}H_{S,K} G_K$
细节处理,对于每一个$S$,先计算$F_S$,最后再将$F_S$再加到$G_S$中去。
#include<algorithm>
#include<iostream>
#include<cstring>
#include<cstdio>
#include<cmath>
#define LL long long
#define mod 1000000007
#define M 33000
#define N 20
using namespace std;
int read(){
int nm=0,fh=1;char cw=getchar();
for(;!isdigit(cw);cw=getchar()) if(cw=='-') fh=-fh;
for(;isdigit(cw);cw=getchar()) nm=nm*10+(cw-'0');
return nm*fh;
}
int n,m,sq[M],u,v;
int ind[M],otd[M],G[M],F[M],cnt[M],MAXN,sum[M],W[M];
int mul(int x,int y){return (LL)x*(LL)y%mod;}
int add(int x,int y){return (x+y)>=mod?x+y-mod:x+y;}
int mus(int x,int y){return (x-y)<0?x-y+mod:x-y;}
void init(int now,int sta){
if(!now) return; init((now-1)&sta,sta);
int dt=(now&-now);
W[now]=add(W[now^dt],cnt[ind[dt]&sta]);
}
int main(){
n=read(),m=read(),sq[0]=1,MAXN=(1<<n);
for(int i=1;i<=m;i++){
sq[i]=add(sq[i-1],sq[i-1]),u=read()-1,v=read()-1;
ind[1<<v]|=(1<<u),otd[1<<u]|=(1<<v);
}
for(int i=1;i<MAXN;i++) cnt[i]=cnt[i>>1]+(i&1);
for(int i=1;i<MAXN;i++){
int ot=i-(i&-i),dt=(i&-i);
sum[i]=sum[ot]+cnt[ind[dt]&i]+cnt[otd[dt]&i];
F[i]=sq[sum[i]],init(i,i);
for(int S=ot;S;S=((S-1)&ot)) G[i]=mus(G[i],mul(F[i^S],G[S]));
for(int S=i;S;S=((S-1)&i)) F[i]=mus(F[i],mul(sq[sum[i]-W[S]],G[S]));
G[i]=add(G[i],F[i]);
}
printf("%d\n",F[MAXN-1]);
return 0;
}
BZOJ3812 清华集训2014 主旋律的更多相关文章
- 【uoj#37/bzoj3812】[清华集训2014]主旋律 状压dp+容斥原理
题目描述 求一张有向图的强连通生成子图的数目对 $10^9+7$ 取模的结果. 题解 状压dp+容斥原理 设 $f[i]$ 表示点集 $i$ 强连通生成子图的数目,容易想到使用总方案数 $2^{sum ...
- 【UOJ#37】 [清华集训2014] 主旋律
题目链接 题目描述 给定一张强联通图,求有多少种边的存在情况满足图依然强联通. \(n\leq15\) Sol 首先正难则反,考虑用总数减去不强联通的. 考虑一张不强联通的图,缩点后一定是一个 DAG ...
- uoj 41 【清华集训2014】矩阵变换 婚姻稳定问题
[清华集训2014]矩阵变换 Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://uoj.ac/problem/41 Description 给出 ...
- AC日记——【清华集训2014】奇数国 uoj 38
#38. [清华集训2014]奇数国 思路: 题目中的number与product不想冲: 即为number与product互素: 所以,求phi(product)即可: 除一个数等同于在模的意义下乘 ...
- UOJ#46. 【清华集训2014】玄学
传送门 分析 清华集训真的不是人做的啊嘤嘤嘤 我们可以考虑按操作时间把每个操作存进线段树里 如果现在点x正好使一个整块区间的右端点则更新代表这个区间的点 我们不难发现一个区间会因为不同的操作被分成若干 ...
- 清华集训2014 sum
清华集训2014sum 求\[∑_{i=1}^{n}(-1)^{⌊i√r⌋}\] 多组询问,\(n\leq 10^9,t\leq 10^4, r\leq 10^4\). 吼题解啊 具体已经讲得很详细了 ...
- 清华集训2014 day1 task2 主旋律
题目 这可算是一道非常好的关于容斥原理的题了. 算法 好吧,这题我毫无思路,直接给正解. 首先,问题的正面不容易求,那么就求反面吧: 有多少种添加边的方案,使得这个图是DAG图(这里及以下所说的DAG ...
- UOJ#37. 【清华集训2014】主旋律
题目大意: 传送门 题解: 神题……Orz. 首先正难则反. 设$f_S$表示选取点集状态为s时,这部分图可以构成非强联通图的方案数. 设$p_{S,i}$表示点集s缩点后有i个入度为0点的方案数,保 ...
- 【UOJ】#37. 【清华集训2014】主旋律
题解 一道,神奇的题= = 我们考虑正难则反,我们求去掉这些边后有多少图不是强连通的 怎么求呢,不是强连通的图缩点后一定是一个DAG,并且这个DAG里面有两个点 我们想一下,如果我们把1当成入度为0的 ...
随机推荐
- python函数式编程-------python2.7教程学习【廖雪峰版】(五)
2017年6月13日19:08:13 任务: 看完函数式编程 笔记: 该看:函数式编程1.函数是Python内建支持的一种封装,我们通过把大段代码拆成函数,通过一层一层的函数调用,就可以把复杂任务分解 ...
- jQuery Easy UI Draggable(拖动)组件
上文已经提到过了 jQuery EasyUI插件引用一般我们经常使用的有两种方式(排除easyload载入方式),所以本篇要总结的Draggable组件相同有两种方式载入: (1).使用class载入 ...
- [Android] 拍照、截图、保存并显示在ImageView控件中
近期在做Android的项目,当中部分涉及到图像处理的内容.这里先讲述怎样调用Camera应用程序进行拍照,并截图和保存显示在ImageView控件中以及遇到的困难和解决方法. PS:作者购买 ...
- 去除app中的标题栏
我之前一直用的是在oncreate方法中添加 requestWindowFeature(Window.FEATURE_NO_TITLE),并且必须写在setContentView(R.layout.a ...
- centos7.0 tomcat9.0 ip访问 manager
版本:Tomcat 9.0 问题:新安装的tomcat,用其他机器访问tomcat的Server Status.Manager App.Host Manager三个页面均显示403(本机访问没有问题) ...
- js的new到底干了啥 -
javascript通过new操作符构建一个对象的步骤 <Javascript高级程序设计>的解释: 创建一个对象 将构造函数的作用域赋给新对象(把新对象作为构造函数的调用上下文,也就是t ...
- Ubuntu 下安装JDK1.8
好困,不行了,我要睡觉了,先上图吧!
- php解析xml文件为数组
$xml = simplexml_load_file($fullfilename); $arr = json_decode(json_encode($xml),true); echo "&l ...
- Django redis2 列表 和其他操作
列表的操作 List操作,redis中的List在在内存中按照一个name对应一个List来存储.如图: lpush插值至列表最左边 lpush(name,values) # 在name对应的list ...
- Excel 文件下载
INCLUDE OLE2INCL * ALV输出 CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY' EXPORTING I_CALLBACK_PRO ...