题目

有\(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. Windows安装Nginx需要注意的地方

      在使用 Nginx 之前,首先要三连问,它是什么?用来做什么?为什么用它? 这篇文章很好的解答了上面的问题,并补充了什么是正向代理和反向代理以及区别的知识 https://www.cnblogs. ...

  2. 大数据基础总结---MapReduce和YARN技术原理

    Map Reduce和YARN技术原理 学习目标 熟悉MapReduce和YARN是什么 掌握MapReduce使用的场景及其原理 掌握MapReduce和YARN功能与架构 熟悉YARN的新特性 M ...

  3. 单片机成长之路(51基础篇)- 024 基于 N76E003 的按键按键状态机

    前端时间要用按键,搞了个状态机(如图): main.c #include <N76E003.H> #include <SFR_Macro.h> //N76E003 SFR寄存器 ...

  4. WPF精修篇 多数据触发器

    原文:WPF精修篇 多数据触发器 有多属性触发器 就有多数据触发器 <Grid> <CheckBox x:Name="c1" Content="许可协议 ...

  5. EF Code first主从表,删除更新从表

    以order和orderItem为例,从表orderItem里有主表的orderId 想通过order.orderitems.add()或者remove()方法直接更新从表的话,必须在从表建立联合主键 ...

  6. python接收字符并回显

    # -*- coding: utf-8 -* import serial import time # 打开串口 ser = serial.Serial("/dev/ttyAMA0" ...

  7. json传的解析,二维数据解析

    下载地址:https://share.weiyun.com/447eda75fdd46cb87f6622ecdce4c3ac

  8. js的6种继承方式

    重新理解js的6种继承方式 注:本文引用于http://www.cnblogs.com/ayqy/p/4471638.html 重点看第三点 组合继承(最常用) 写在前面 一直不喜欢JS的OOP,在学 ...

  9. 精益车间管理如何实现?让APS排程系统来帮忙

    精益制造是企业全面的文化改变,它的主要目标是消灭任何形式的浪费.最明显的例子是在生产区域堆积的物料.在制品.等待客户来买的成品.它还可能包括员工不必的移动和不增值的许多流程,目标是在最小的库存,最短的 ...

  10. 由于找不到mingwm10.dll 由于找不到QtCore4.dll

    出现如下错误: 由于找不到mingwm10.dll 由于找不到QtCore4.dll 解决办法 将qt库加入环境变量