博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
BZOJ3812 清华集训2014 主旋律
阅读量:4705 次
发布时间:2019-06-10

本文共 1303 字,大约阅读时间需要 4 分钟。

 

直接求出强联通生成子图的数量较难,不妨用所有生成子图的数量减去非强联通的。

非强联通生成子图在所点后满足编号最小的点所在的强联通分量不是全集。

由于$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
#include
#include
#include
#include
#define LL long long#define mod 1000000007#define M 33000#define N 20using 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<
>1]+(i&1); for(int i=1;i

 

转载于:https://www.cnblogs.com/OYJason/p/9734436.html

你可能感兴趣的文章
数据驱动之 python + requests + Excel
查看>>
TCP/IP协议(4):网络层
查看>>
Eclipse下配置python开发环境插件
查看>>
for循环闭包添加事件方法
查看>>
temp for @青
查看>>
npm 换源
查看>>
Vultr Debian8系统一键快速DD安装Windows7系统
查看>>
PAT 1085 Perfect Sequence[难]
查看>>
Wepy开发小程序文档
查看>>
搭建前后端分离网站
查看>>
PE学习
查看>>
ssh框架整合之注解版
查看>>
2018-2019-2 网络对抗技术 20165231 Exp7 网络欺诈防范
查看>>
去买电脑时注意的问题
查看>>
JavaScript之单线程
查看>>
哈夫曼树
查看>>
Silverlight.XNA(C#)跨平台3D游戏研发手记:(三)蜂窝拓扑结构在SLG地图布局中的应用...
查看>>
Python学习笔记1:用户登录
查看>>
pelican AttributeError: 'unicode' object has no attribute 'slug'
查看>>
HIVE存储(三)RCFile
查看>>