标签:
显然只有当暗恋关系是链的时候才能塞进座位里。
一人连着>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 }
标签:
原文地址:http://www.cnblogs.com/czllgzmzl/p/5596310.html