题目链接:

3444: 最后的晚餐

Time Limit: 5 Sec  Memory Limit: 128 MB

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
 
题意:
 
思路:
 
只有单链和点才满足要求,分叉和环都不能有;链有两个方向放所以ans=(l+r)!*2^l;l为链的个数,r为点的个数;
 
AC代码:
/**************************************************************
Problem: 3444
User: LittlePointer
Language: C++
Result: Accepted
Time:6100 ms
Memory:67784 kb
****************************************************************/ #include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>
#include <bits/stdc++.h>
#include <stack>
#include <map> using namespace std; #define For(i,j,n) for(int i=j;i<=n;i++)
#define mst(ss,b) memset(ss,b,sizeof(ss)); typedef long long LL; template<class T> void read(T&num) {
char CH; bool F=false;
for(CH=getchar();CH<'0'||CH>'9';F= CH=='-',CH=getchar());
for(num=0;CH>='0'&&CH<='9';num=num*10+CH-'0',CH=getchar());
F && (num=-num);
}
int stk[70], tp;
template<class T> inline void print(T p) {
if(!p) { puts("0"); return; }
while(p) stk[++ tp] = p%10, p/=10;
while(tp) putchar(stk[tp--] + '0');
putchar('\n');
} const LL mod=989381;
const double PI=acos(-1.0);
const int inf=1e9;
const int N=5e5+20;
const int maxn=1e4+220;
const double eps=1e-12; int n,m,in[N],p[N],sum[N],num,vis[N];
vector<int>ve[N];
int findset(int x)
{
if(x==p[x])return x;
return p[x]=findset(p[x]);
}
inline void same(int x,int y)
{
int fx=findset(x),fy=findset(y);
if(fx!=fy)
{
p[fx]=fy;
sum[fy]+=sum[fx];
sum[fx]=0;
}
} map<int,int>mp[N];
void dfs(int cur,int fa)
{
vis[cur]=1;
num++;
int len=ve[cur].size();
for(int i=0;i<len;i++)
{
int temp=ve[cur][i];
if(temp==fa)continue;
dfs(temp,cur);
}
}
int check()
{
for(int i=1;i<=n;i++)
{
if(in[i]>2)return 0;
}
num=0;
for(int i=1;i<=n;i++)
{
if(!vis[i])
{
if(in[i]==0)vis[i]=1,num++;
else if(in[i]==1)dfs(i,0);
}
}
if(num!=n)return 0;
return 1;
}
LL pow_mod(int y)
{
LL s=1,base=2;
while(y)
{
if(y&1)s=s*base%mod;
base=base*base%mod;
y>>=1;
}
return s;
}
int main()
{
//freopen("in.txt","r",stdin);
read(n);read(m);
for(int i=0;i<=n;i++)p[i]=i,sum[i]=1;
int u,v;
For(i,1,m)
{
read(u);read(v);
if(mp[v][u])continue;
ve[u].push_back(v);
ve[v].push_back(u);
same(u,v);
in[u]++;
in[v]++;
mp[u][v]=1;
}
LL ans=0;
if(check())
{
ans=1;
int l=0,r=0;
for(int i=1;i<=n;i++)
{
if(p[i]!=i)continue;
if(sum[i]>1)l++;
else r++;
}
for(int i=1;i<=l+r;i++)ans=ans*(LL)i%mod;
ans=ans*pow_mod(l)%mod;
}
cout<<ans<<endl; return 0;
}

  

bzoj-3444 3444: 最后的晚餐(组合数学)的更多相关文章

  1. Bzoj 4403: 序列统计 Lucas定理,组合数学,数论

    4403: 序列统计 Time Limit: 3 Sec  Memory Limit: 128 MBSubmit: 328  Solved: 162[Submit][Status][Discuss] ...

  2. BZOJ 1211: [HNOI2004]树的计数( 组合数学 )

    知道prufer序列就能写...就是求个可重集的排列...先判掉奇怪的情况, 然后答案是(N-2)!/π(d[i]-1)! -------------------------------------- ...

  3. 【BZOJ】4767: 两双手【组合数学】【容斥】【DP】

    4767: 两双手 Time Limit: 10 Sec  Memory Limit: 256 MBSubmit: 1057  Solved: 318[Submit][Status][Discuss] ...

  4. 【BZOJ】1008: [HNOI2008]越狱(组合数学)

    题目 题目描述 监狱有连续编号为1...N的N个房间,每个房间关押一个犯人,有M种宗教,每个犯人可能信仰其中一种.如果相邻房间的犯人的宗教相同,就可能发生越狱,求有多少种状态可能发生越狱 输入输出格式 ...

  5. BZOJ 1005: [HNOI2008]明明的烦恼( 组合数学 + 高精度 )

    首先要知道一种prufer数列的东西...一个prufer数列和一颗树对应..然后树上一个点的度数-1是这个点在prufer数列中出现次数..这样就转成一个排列组合的问题了.算个可重集的排列数和组合数 ...

  6. BZOJ 3456: 城市规划 [多项式求逆元 组合数学 | 生成函数 多项式求ln]

    3456: 城市规划 题意:n个点组成的无向连通图个数 以前做过,今天复习一下 令\(f[n]\)为n个点的无向连通图个数 n个点的完全图个数为\(2^{\binom{n}{2}}\) 和Bell数的 ...

  7. BZOJ 3505 [Cqoi2014]数三角形(组合数学)

    [题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=3505 [题目大意] 给定一个nxm的网格,请计算三点都在格点上的三角形共有多少个. 注 ...

  8. bzoj 3027: [Ceoi2004]Sweet【生成函数+组合数学】

    首先根据生成函数的套路,这个可以写成: \[ \prod_{i=1}^{n}(1+x^1+x^2+...+x^{c[i]}) \] 然后化简 \[ =\prod_{i=1}^{n}\frac{1-x^ ...

  9. bzoj 4403: 序列统计【lucas+组合数学】

    首先,给一个单调不降序列的第i位+i,这样就变成了单调上升序列,设原来数据范围是(l,r),改过之后变成了(l+1,r+n) 在m个数里选长为n的一个单调上升序列的方案数为\( C_m^n \),也就 ...

随机推荐

  1. python学习笔记2(pycharm、数据类型)

    Pycharm 的使用 IDE(Integrated  Development  Environ ment) :集成开发环境 Vim  :经典的linux下的文本编辑器(菜鸟和大神喜欢使用) Emac ...

  2. Design Patterns (简单工厂模式)

    文章很长很精彩,如是初学请耐心观看.(大神请绕道!) 简单工厂模式: 1.创建型模式 2.简单工厂模式概述 3.简单工厂模式的结构与实现 4.简单工厂模式的应用实例 5.创建对象与使用对象 6.简单工 ...

  3. HTML 运算符、类型转换

    1.类型转换: 分为自动转换和强制转换,一般用强制转换. 其他类型转换为整数:parseInt(): 其他类型转换为小数:parseFloat(): 判断是否是一个合法的数字类型:isNaN(): 是 ...

  4. HTML JavaScript简介

    一.JavaScript简介 1.JavaScript是个什么东西? 它是个脚本语言,需要有宿主文件,它的宿主文件是HTML文件. 2.它与Java什么关系? 没有什么直接的联系,Java是Sun公司 ...

  5. Eclipse反编译工具Jad及插件JadClipse配置

    Jad是一个Java的一个反编译工具,是用命令行执行,和通常JDK自带的java,javac命令是一样的.不过因为是控制台运行,所以用起来不太方便.不过幸好有一个eclipse的插件JadClipse ...

  6. AngularJS的指令用法

    scope的绑定策略: @ :把当前属性作为字符串传递,你还可以绑定来自外层scope的值,在属性值中插入 {{}}即可 示例代码: scopeAt.html <!doctype html> ...

  7. javascript-this,call,apply,bind简述3

    上节介绍了call()和apply()的用法,这节再讨论一下arguments参数和bind函数的用法以及函数柯里化就算是完结了. bind()函数 先看定义: bind()方法会创建一个函数的实例, ...

  8. 使用div创建选取框

    使用div实现了选取框效果. 代码如下 <!DOCTYPE html> <html> <head> <title>myCanvasTest</ti ...

  9. 部分博文目录索引(C语言+算法)

    今天将本博客的部分文章建立一个索引,方便大家进行阅读,当然每一类别中的文章都会持续的添加和更新(PS:博文主要使用C语言) 博客地址:http://www.cnblogs.com/archimedes ...

  10. iOS开发之保存照片到自己创建的相簿

    iOS开发之保存照片到自己创建的相簿 保存照片还可以用ALAssetsLibrary,ALAssetsLibrary提供了我们对iOS设备中的相片.视频的访问,是连接应用程序和相册之间访问的一个桥梁. ...