题目

有\(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. for循环居然还可以这样写

    公司代码有点坑,查找问题,发现for循环的写法不是固定条件在中间,写反了也是可以运行的.比如:下面一个简单的for循环 int m=0; for(int i=0;i>3;i++){ m=m+i; ...

  2. SQL忽略重复键作用

    1.插入时如果开启的话,发现重复键会忽略,否则报错 2.更新时不管开启是否都会报错

  3. 使用索引别名和Rollover滚动创建索引

    使用索引别名和Rollover滚动创建索引 在ElasticSearch6.3.2 集群做节点冷(warm) 热(hot) 分离中,实现了ElasticSearch集群节点的冷热分离,新创建的索引只允 ...

  4. flutter-初识(基础语法)

    前言:笔者学过 java,刚刚接触 flutter,记录下基本的一些语法. 一.认识Flutter Flutter 是 google 推出的,使用的 Dart 语言,它可以跨平台实现 Android ...

  5. HTML--元素居中各种处理方法2

    紧接上一篇. 如果要居中的是一个块元素呢. 1)如果你知道这个块元素的高度: <main> <div> I'm a block-level element with a fix ...

  6. 数据路由通信--ospf复习

    数据路由通信--ospf 复习 ospf 复习 今天来回顾一下ospf ospf全名叫做开放式最短路径优先协议,它是一种基于链路状态的内部网关路由协议.ospf支持区域的划分,内部的路由器使用spf最 ...

  7. Java中转换为二进制的几种实现

    public class HexUtil { private static final String[] DIGITS_UPPER = {"0", "1", & ...

  8. 【02】Jenkins:第一个项目

    写在前面的话 通过上一节我们成功的搭建起来 Jenkins,那么接下来就是体验如何构建我们的第一个项目了.当然在这之前我们得专门针对 Java 环境就行简单的配置. 全局工具配置 其实这次配置的主要还 ...

  9. 关于toLocaleString(), toString(), valueOf()方法的使用

    所有对象都是具有toLocalString(), toString(), valueOf()三种方法的,此篇博客主要是讲述其在Array引用类型上的使用. 基本使用 调用valueOf()返回的是数组 ...

  10. React路由安装使用和多种方式传参

    安装路由 npm i react-router-dom -S 引入路由 import { BowserRouter as Router, Route, Switch, ... } from " ...