题目

有\(n\)个现实城市,另有\(n\)个幻想城市

原图中在现实城市存在\(m\)条边,在幻想城市存在\(m-1-n\)条边

一个排列是合法的当且进当显示城市 \(i\) 向幻想城市 \(p_i\) 连边后,图是连通的

求合法的排列数目

\(n \le 20 \ , \ 时限10s\)

题解

  • 如果初始连通块个数\(\gt n+1\)个无解;
  • 考虑这\(n+1\)个连通块,设\(S\)表示已经分配好的连通块集合的合法排列个数
  • 转移时用总的减去不合法的,不合法考虑枚举编号最小的城市所在联通块
  • 时间复杂度:\(O(3^{20})\)
  • 由于一个状态如果不满足现实和幻想的连通块点数和相等就是无用的,可以去掉很多无用状态

Code

#include<bits/stdc++.h>
#define mod 998244353
using namespace std;
const int N=21;
int n,m,n1,n2,tot,f[N],sz[N],sz1[1<<N],sz2[1<<N],all1,all2,all,fac[N],F[1<<N],G[1<<N];
int find(int x){return f[x]==x?x:f[x]=find(f[x]);}
void dec(int&x,int y){x-=y;if(x<0)x+=mod;}
void uni(int u,int v){
int fu=find(u),fv=find(v);
if(fu==fv)return;
f[fu]=fv;sz[fv]+=sz[fu];
}
int main(){
freopen("milk.in","r",stdin);
freopen("milk.out","w",stdout); scanf("%d%d",&n,&m);
for(int i=fac[0]=1;i<=n;++i)fac[i]=1ll*fac[i-1]*i%mod; for(int i=1;i<=n;++i)f[i]=i,sz[i]=1;
for(int i=1,u,v;i<=m;++i){
scanf("%d%d",&u,&v);
uni(u,v);
}
for(int i=1;i<=n;++i)if(find(i)==i){
sz1[1<<tot++]=sz[i];
}
n1=tot;tot=0;all1=(1<<n1)-1;
for(int i=0;i<n1;++i)
for(int j=0;j<=all1;++j)
if(j>>i&1)sz1[j]+=sz1[j^(1<<i)]; m=n-1-m;
for(int i=1;i<=n;++i)f[i]=i,sz[i]=1;
for(int i=1,u,v;i<=m;++i){
scanf("%d%d",&u,&v);
uni(u,v);
}
for(int i=1;i<=n;++i)if(find(i)==i){
sz2[1<<tot++]=sz[i];
}
n2=tot;tot=0;all2=(1<<n2)-1;
for(int i=0;i<n2;++i)
for(int j=0;j<=all2;++j)
if(j>>i&1)sz2[j]+=sz2[j^(1<<i)]; all=(1<<(n1+n2))-1;
if(n1+n2!=n+1){puts("0");return 0;}
F[0]=G[0]=1;
for(int S=1;S<=all;++S){
int v1=sz1[S&all1],v2=sz2[S>>n1];
if(v1!=v2)continue;
G[S]=fac[v1];
}
for(int S=1;S<=all;++S)if(G[S]){
F[S]=G[S];
int x=S&-S,R=S^x;
if(x>all1)continue;
for(int T=R;T;T=(T-1)&R)if(G[T]){
dec(F[S],1ll*G[T]*F[S^T]%mod);
}
}
cout<<F[all]<<endl;
return 0;
}

【JZOJ5739】【20190706】毒奶的更多相关文章

  1. 【JZOJ5738】【20190706】锁屏杀

    题目 $n \le 2000 $ 题解 \(B\)的数字可以对1440取模,对三个图分别进行\(dp\)即可 时间复杂度\(O(n\times 1440 \times 10)\) Code #incl ...

  2. 【JZOJ5740】【20190706】幻想世界

    题目 小 $\omega $ 想要进行烟火表演,她一开始有\(n\)颗彗星和\(n\)颗陨石 如果小 \(\omega\) 有\(i\)颗彗星而没有陨石,那么她会消耗\(i\)颗彗星并得到\(a_i\ ...

  3. 2019-07-06 sql 连续出现次数

    由手机通讯记录界面想到的问题 SELECT CASE WHEN AA.num=1 THEN AA.Tel ELSE AA.Tel+'('+CASt(AA.num AS VARCHAR(4))+')' ...

  4. 2019-07-06 sql备忘 连续取最大

    连续最大: SELECT M.* FROM #temp MINNER JOIN (SELECT ISNULL(A.score,0)-b.score AS score,B.id FROM #temp A ...

  5. 论SCRM系统对传统行业的冲击

    SCRM(Social Customer Relationship Management)顾名思义是社会型客户关系管理系统,这在当前的电子商务领域是一个创新的概念,由于社交媒体(Social Medi ...

  6. NOIP2016の遊記

    看了cydiater的游记,我更加认识到我有多弱,大神有多强 剩余的时间不多了,NOIP前停的一周课又颓了相当多的时间,感觉NOIP真的药丸 最后一天复习模板,看一下错误,总结做题的经验,现在实力实在 ...

  7. 【javascript】详解变量,值,类型和宿主对象

    前言 我眼中的<javascript高级程序设计> 和<你不知道的javascript>是这样的:如果<javascript高级程序设计>是本教科书的话, < ...

  8. bzoj4974 字符串大师

    4974: 字符串大师 Time Limit: 1 Sec  Memory Limit: 256 MBSubmit: 310  Solved: 155[Submit][Status][Discuss] ...

  9. PKUWC 2018游记

    PKUWC 2018游记 标签: Day\([-inf,0)\) 停课之后一直各种浪的飞起,考试rank20+,不搞颓但是学习很没有状态.还经常带着耳机被谢总抓了好几次,然后被拉过去谈话了好几次... ...

随机推荐

  1. 简要介绍Active Learning(主动学习)思想框架,以及从IF(isolation forest)衍生出来的算法:FBIF(Feedback-Guided Anomaly Discovery)

    1. 引言 本文所讨论的内容为笔者对外文文献的翻译,并加入了笔者自己的理解和总结,文中涉及到的原始外文论文和相关学习链接我会放在reference里,另外,推荐读者朋友购买 Stephen Boyd的 ...

  2. python 练习题:定义一个函数quadratic(a, b, c),接收3个参数,返回一元二次方程ax^2+bx+c=0的两个解

    请定义一个函数quadratic(a, b, c),接收3个参数,返回一元二次方程 ax^2+bx+c=0的两个解. 提示: 一元二次方程的求根公式为: x1 = (-b + math.sqrt((b ...

  3. Qt高仿Excel表格组件-支持冻结列、冻结行、内容自适应和合并单元格

    目录 一.概述 二.效果展示 三.实现思路 1.冻结行.冻结列 2.行高自适应 3.蚂蚁线 四.测试代码 1.添加表格数据 2.设置冻结行.列 3.行高.列宽 4.单元格背景色 5.单元格文字 6.其 ...

  4. H5离线缓存(基础)学习指南

    离线缓存 application cache 1. 什么是离线缓存: 离线缓存可以将站点的一些文件缓存到本地,它是浏览器自己的一种机制,将需要的文件缓存下来,以便后期即使没有连接网络,被缓存的页面也可 ...

  5. qtp安装和使用

    QTP许可证密钥的破解步骤: 以前使用QTP9.2 使用此方法成功破解,现在本人使用的HP QuickTest Professional 11 英文版,也成功适用. 一.准备工作: 1. 由于注册码文 ...

  6. 配置OEL7 YUM源

    用于其他发行版如rhel.centos有时候要用到oracle linux的源来装软件比如oracle.mysql等 配置oel7源 wget http://public-yum.oracle.com ...

  7. 尚硅谷MySQL高级学习笔记

    目录 数据库MySQL学习笔记高级篇 写在前面 1. mysql的架构介绍 mysql简介 mysqlLinux版的安装 mysql配置文件 mysql逻辑架构介绍 mysql存储引擎 2. 索引优化 ...

  8. Alipay支付宝调用错误:Call to undefined function openssl_sign()

    打开php.ini,找到这一行 ;extension=php_openssl.dll,将前面的“;”去掉: 重启服务器.

  9. hexo 搜索功能

    搜索功能真心好用,当文章多起来的时候,标签提供的作用已经很少了,只能简单索引,搜索却能精确查找,这里我用的依旧是最简单的本地站内搜索. 安装插件 npm install hexo-generator- ...

  10. python相关资源

    http://blog.csdn.net/ken_wanglin/article/details/53095967 http://www.infoq.com/cn/articles/Python-wr ...