码迷,mamicode.com
首页 > 其他好文 > 详细

[bzoj3444] 最后的晚餐

时间:2016-06-18 16:54:58      阅读:133      评论:0      收藏:0      [点我收藏+]

标签:

  显然只有当暗恋关系是链的时候才能塞进座位里。

  一人连着>2人的话就无解,小心重边。

  一条链本身有两种方案,假设总共有n个联通块,其中m条链,答案就是n!*2^m

  一开始因为重边炸了几发

技术分享
 1 #include<cstdio>
 2 #include<iostream>
 3 #include<cstring>
 4 #include<algorithm>
 5 #define ll long long
 6 using namespace std;
 7 const int maxn=500233,modd=989381;
 8 int fa[maxn],deg[maxn],sz[maxn],to[maxn],cnt;
 9 int i,j,k,n,m;
10 bool gg;
11  
12 int ra;char rx;
13 inline int read(){
14     rx=getchar(),ra=0;
15     while(rx<0||rx>9)rx=getchar();
16     while(rx>=0&&rx<=9)ra*=10,ra+=rx-48,rx=getchar();return ra;
17 }
18 inline int getfa(int x){return fa[x]!=x?fa[x]=getfa(fa[x]):x;}
19 inline void merge(int a,int b){
20     if(to[b]!=a)deg[a]++,deg[b]++;
21     if(deg[a]>2||deg[b]>2)gg=1;
22     int x=a,y=b;
23     a=getfa(a),b=getfa(b);
24     if(a!=b)
25         fa[b]=a,sz[a]+=sz[b];
26     else if(sz[a]>2&&to[y]!=x)gg=1;
27 }
28 int main(){
29     n=read(),m=read();
30     for(i=1;i<=n;i++)fa[i]=i,sz[i]=1;
31     for(i=1;i<=m&&!gg;i++)
32         j=read(),to[j]=read(),merge(j,to[j]);
33     if(gg){puts("0");return 0;}
34     ll ans=1;
35     for(i=1;i<=n;i++)if(fa[i]==i){
36         if(sz[i]>1)ans<<=1,ans-=ans>=modd?modd:0;
37         cnt++,ans=ans*cnt%modd;
38     }
39     printf("%lld\n",ans);
40 }
View Code

 

[bzoj3444] 最后的晚餐

标签:

原文地址:http://www.cnblogs.com/czllgzmzl/p/5596310.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!