3444: 最后的晚餐

题目:传送门


题解:

   考虑有解的情况:

   直接上并查集,同一个联通块里的人一定要坐在一起的。不难发现其实对于每个联通块最多就只有两种排列方式,那就直接把大于等于两个人的联通块先去做快速幂,然后直接看成cnt个数来全排列。

   对付无解的情况:

   1、不难想到,有环就无解。

   2、深入想想,一个人最多和两个暗恋对象坐在一起,那么如果一个人暗恋三个人或被三个人暗恋...那也无解

   3、最后一个有点坑,题目说没有自恋,但是没有说两情相悦不OK啊,那就要特判了ORZ

   吐槽:CC问我奇环合不合法...笑眯眯嘿嘿嘿,应该支持同性恋???

  


代码:

 #include<cstdio>
#include<cstring>
#include<cstdlib>
#include<cmath>
#include<algorithm>
#define mod 989381
using namespace std;
typedef long long LL;
int n,m,x,y,fa[];
int findfa(int x){if(fa[x]!=x)fa[x]=findfa(fa[x]);return fa[x];}
LL p_m(LL a,int b)
{
LL ans=;
while(b)
{
if(b%==)ans=ans*a%mod;
a=a*a%mod;b/=;
}
return ans;
}
int d[],tot[];LL cnt;
int mp[];
int main()
{
memset(d,,sizeof(d));memset(mp,,sizeof(mp));
scanf("%d%d",&n,&m);bool bk=true;
for(int i=;i<=n;i++)fa[i]=i;
for(int i=;i<=m;i++)
{
scanf("%d%d",&x,&y);if(mp[y]==x || mp[x]==y)continue;mp[x]=y;
if(d[x]>= || d[y]>=){bk=false;break;}
int fx=findfa(x),fy=findfa(y);
if(fx!=fy)fa[fy]=fx;else {bk=false;break;}
d[x]++;d[y]++;
}
cnt=;memset(tot,,sizeof(tot));LL k=;
if(bk==false){printf("0\n");return ;}
for(int i=;i<=n;i++)fa[i]=findfa(i);
for(int i=;i<=n;i++)
{
if(fa[i]==i)cnt++;
tot[fa[i]]++;
}
for(int i=;i<=n;i++)if(tot[i]==)k++;
LL ans=p_m(,cnt-k);for(LL i=;i<=cnt;i++)ans=ans*i%mod;
printf("%lld\n",ans);
return ;
}

bzoj3444: 最后的晚餐(并查集+组合数学)的更多相关文章

  1. 【bzoj3444】最后的晚餐 并查集

    题目描述 n个人排成一排,有m个条件,第i个条件要求ai和bi相邻,求方案数. 输入 输入有m+1行,第一行有两个用空格隔开的正整数n.m,如题所示.接下来的m行,每一行有两个用空格隔开的正整数,第i ...

  2. 2019牛客暑期多校训练营(第九场) E-All men are brothers(并查集+组合数学)

    >传送门< 题意:最初有 n个人且互不认识,接下来 m行,每行有 x,y表示x和y交朋友,朋友关系满足自反性和传递性,每次输出当前选取4个人且互不认识的方案数. 思路:比赛的时候知道是用并 ...

  3. BZOJ3444 最后的晚餐【细节题+组合数学】*

    BZOJ3444 最后的晚餐 Description [问题背景] 高三的学长们就要离开学校,各奔东西了.某班n人在举行最后的离别晚餐时,饭店老板觉得十分纠结.因为有m名学生偷偷找他,要求和自己暗恋的 ...

  4. 2019牛客多校第⑨场E All men are brothers(并查集+组合数学)

    原题:https://ac.nowcoder.com/acm/contest/889/E 思路: 做并查集,维护每个集合大小,初始化操作前的总方案数,每次合并两个集合时减少的数量=合并的两个集合大小相 ...

  5. BZOJ 4199: [Noi2015]品酒大会 [后缀数组 带权并查集]

    4199: [Noi2015]品酒大会 UOJ:http://uoj.ac/problem/131 一年一度的“幻影阁夏日品酒大会”隆重开幕了.大会包含品尝和趣味挑战两个环节,分别向优胜者颁发“首席品 ...

  6. [UOJ#131][BZOJ4199][NOI2015]品酒大会 后缀数组 + 并查集

    [UOJ#131][BZOJ4199][NOI2015]品酒大会 试题描述 一年一度的“幻影阁夏日品酒大会”隆重开幕了.大会包含品尝和趣味挑战两个环节,分别向优胜者颁发“首席品酒家”和“首席猎手”两个 ...

  7. 4199. [NOI2015]品酒大会【后缀数组+并查集】

    Description 一年一度的“幻影阁夏日品酒大会”隆重开幕了.大会包含品尝和趣味挑战两个环节,分别向优胜者颁发“首席品 酒家”和“首席猎手”两个奖项,吸引了众多品酒师参加.在大会的晚餐上,调酒师 ...

  8. P1197 [JSOI2008]星球大战(并查集判断连通块+正难则反)

    P1197 [JSOI2008]星球大战(并查集判断连通块+正难则反) 并查集本来就是连一对不同父亲的节点就的话连通块就少一个. 题目描述 很久以前,在一个遥远的星系,一个黑暗的帝国靠着它的超级武器统 ...

  9. 第9场 E-All men are brothers(并查集)

    题目链接 题意:n个人,m次操作,每次操作使得两个人(x,y)成为朋友,朋友的关系是可以传递的,计算执行每次操作后,选择四个人两两都不是朋友的不同方案的数目. 数据范围:(n <= 100000 ...

随机推荐

  1. cocos2d-x之浅析Hello World

    ***************************************转载请注明出处:http://blog.csdn.net/lttree************************** ...

  2. DNS反射放大攻击分析——DNS反射放大攻击主要是利用DNS回复包比请求包大的特点,放大流量,伪造请求包的源IP地址为受害者IP,将应答包的流量引入受害的服务器

    DNS反射放大攻击分析 摘自:http://www.shaojike.com/2016/08/19/DNS%E6%94%BE%E5%A4%A7%E6%94%BB%E5%87%BB%E7%AE%80%E ...

  3. NEU2016年一月月赛回顾

    月赛传送门 http://acm.neu.edu.cn/hustoj/contest.php?cid=1066 月赛已经结束十天了...才把题目补完真是大失误... 茅巨巨四天前就补完了,,,总结写得 ...

  4. 编译最新版webrtc源码和编译好的整个项目10多个G【分享】

    编译最新版webrtc源码和编译好的整个项目10多个G[分享] 参考https://webrtc.org/native-code/development/编译最新版webrtc源码: Git clon ...

  5. PHP日期和时间处理组件-Carbon

    https://packagist.org/packages/nesbot/carbon 我们使用PHP时经常需要处理日期和时间,有时会被时间时区搞混淆,而Carbon是PHP中很人性化的时间日期处理 ...

  6. tp5页面跳转,空控制器空方法

    namespace app\index\controller; use think\Controller; class Login extends Controller{ //显示html页面 pub ...

  7. 微信小程序引用阿里巴巴矢量图标iconfont

    最近在写微信小程序,但是引用图片,导致项目文件太大,所以就想到引用阿里巴巴矢量图标的方法 第一步:下载阿里巴巴矢量图代码: 第二步:将下载下来的文件中iconfont.ttf转换即可.转换地址:htt ...

  8. svn中有的代码被标注黄色,绿色和红色,分别表示什么意思呢?

    1.红色感叹号表示这个文件从服务器上下载下来以后,在本地被修改过.这时执行提交操作就可以了.2.黄色感叹号表示这个文件在提交的时候发现存在冲突,也就是说有别人在你提交之前对这个文件的同一个版本进行了修 ...

  9. java中端口号被占用的解决办法

    第一步,命令提示符号,执行命令:netstat -ano 可见,占用1099端口的进程的PID是10460. 第二步,命令提示符号,执行命令:tasklist(通过pid 10460定位) 可见,该占 ...

  10. luoguP1002

    p1002 题意: 从坐标A到坐标B的可能路线(有一些点不能走)情况,很明显可以看出用dp做 m[i][j]=m[i-1][j]+m[i][j-1](注意处理不能走的点) 自己在初始化时犯了错,第1行 ...