Description

【问题背景】
高三的学长们就要离开学校,各奔东西了。某班n人在举行最后的离别晚餐时,饭店老板觉得十分纠结。因为有m名学生偷偷找他,要求和自己暗恋的同学坐在一起。
【问题描述】
饭店给这些同学提供了一个很长的桌子,除了两头的同学,每一个同学都与两个同学相邻(即坐成一排)。给出所有信息,满足所有人的要求,求安排的方案总数(这个数字可能很大,请输出方案总数取余989381的值,也可能为0)。

Input

输入有m+1行,第一行有两个用空格隔开的正整数n、m,如题所示。接下来的m行,每一行有两个用空格隔开的正整数,第i行为Ai和Bi,表示Ai的暗恋对象为Bi,保证Ai互不相等。

Output

输出只有一行,这一行只有一个数字,如题所示。

Sample Input

4 2
1 2
4 3

Sample Output

8

【数据范围】
100%的数据,0<n≤500000,1≤Ai,Bi≤n,0≤m≤n,保证没有人自恋。

 
把暗恋关系看作双向边,如果所有点度数都<=2,且没有环则有解。
否则不难发现每个连通分量是一条链,如果链上元素多于1则答案是2,否则答案是1。
每个连通分量肯定在一起,所以再将答案乘以连通分量个数的阶乘就行了。
#include<cstdio>
#include<cctype>
#include<queue>
#include<cmath>
#include<cstring>
#include<algorithm>
#define rep(i,s,t) for(int i=s;i<=t;i++)
#define dwn(i,s,t) for(int i=s;i>=t;i--)
#define ren for(int i=first[x];i;i=next[i])
using namespace std;
const int BufferSize=<<;
char buffer[BufferSize],*head,*tail;
inline char Getchar() {
if(head==tail) {
int l=fread(buffer,,BufferSize,stdin);
tail=(head=buffer)+l;
}
return *head++;
}
inline int read() {
int x=,f=;char c=Getchar();
for(;!isdigit(c);c=Getchar()) if(c=='-') f=-;
for(;isdigit(c);c=Getchar()) x=x*+c-'';
return x*f;
}
typedef long long ll;
const int mod=;
const int maxn=;
int n,m,A[maxn],in[maxn],pa[maxn];
int findset(int x) {return pa[x]==x?x:pa[x]=findset(pa[x]);}
int main() {
n=read();m=read();
rep(i,,n) pa[i]=i;
rep(i,,m) {
int u=read(),v=read();
if(A[v]==u) continue;
if(findset(u)==findset(v)) {puts("");return ;}
pa[findset(u)]=findset(v);
in[v]++;in[u]++;A[u]=v;
}
int ok=,blo=;
rep(i,,n) {
if(in[i]>) ok=;
if(findset(i)==i) blo++;
}
if(!ok) puts("");
else {
ll ans=,cnt=;
rep(i,,blo) (ans*=i)%=mod;
rep(i,,n) if(!in[i]) cnt++;
rep(i,,blo-cnt) (ans*=)%=mod;
printf("%lld\n",ans);
}
return ;
}

最新文章

  1. h5网页的知识点
  2. yformater - chrome谷歌浏览器json格式化json高亮json解析插件
  3. Struts2_ValueStack,OGNL详解(转)
  4. vi、vim 查找替换
  5. socket关联查询
  6. git -- 如何撤销本地工作目录的修改
  7. IntelliJ IDEA 2016.1.4 git 切换分支详解
  8. A Simple Math Problem(矩阵快速幂)(寒假闭关第一题,有点曲折啊)
  9. (新)elasticsearch6.0版本安装head插件
  10. Xcode的playground中对于SpriteKit物理对象的更新为何无效
  11. iis7.5做反向代理配置方法实例图文教程
  12. Huawei BGP和OSPF双边界重分布(二)
  13. 第十七章 java8特性
  14. 2018 ACM 网络选拔赛 沈阳赛区
  15. 使用Jenkins 安装和自动化部署项目
  16. 2019.02.09 bzoj1042: [HAOI2008]硬币购物(完全背包+容斥原理)
  17. POJ3186(KB12-O DP)
  18. IT人都非常忙(茫)
  19. postgresql模式创建、修改、删除
  20. SSIS中出现数据流数据源假死状态的解决办法

热门文章

  1. 【转】solr+ajax智能拼音详解---solr跨域请求
  2. cocos2dx混合模式应用
  3. 项目总结(四)--- 网络封包分析工具Charles
  4. surface RT app安装心得
  5. 如何在Win8系统上建立WIFI热点
  6. Android textView点击滚动(跑马灯)效果
  7. Maven使用笔记(四)pom.xml配置详解
  8. 企业级项目中最常用到的SQL
  9. javascript字典数据结构常用功能实现
  10. Ubuntu常用命令大全(转)