在合法的情況下,最后肯定是所有人的喜歡關系組成了若干個鏈,然后這些鏈可以任意排列,長度大於2的鏈可以翻轉,所以答案就是鏈數量的階乘乘以2的長度大於1的鏈個數次方
不合法的情況:分叉了,有環
當然兩個人互相喜歡這種情況是不算環的>_<
#include<iostream> #include<cstdlib> #include<cstdio> #include<cstring> #include<cmath> #include<ctime> #include<algorithm> #include<iomanip> #include<vector> #include<stack> #include<queue> #include<map> #include<set> #include<bitset> using namespace std; #define MAXN 500010 #define MAXM 1010 #define ll long long #define INF 1000000000 #define MOD 989381 #define eps 1e-8 int f[MAXN],siz[MAXN]; int d[MAXN]; int n,m; int tot; ll ans=1; bool vis[MAXN]; map<int,bool>love[MAXN]; int fa(int x){ return f[x]==x?x:f[x]=fa(f[x]); } int main(){ int i,x,y; scanf("%d%d",&n,&m); for(i=1;i<=n;i++){ f[i]=i; siz[i]=1; } for(i=1;i<=m;i++){ scanf("%d%d",&x,&y); love[x][y]=1; if(fa(x)!=fa(y)){ d[x]++; d[y]++; if(d[x]>2||d[y]>2){ printf("0\n"); return 0; } siz[fa(x)]+=siz[fa(y)]; f[fa(y)]=fa(x); }else if(!love[y][x]){ printf("0\n"); return 0; } } for(i=1;i<=n;i++){ if(!vis[fa(i)]){ vis[fa(i)]=1; if(siz[fa(i)]>=2){ (ans*=2)%=MOD; } tot++; } } for(i=tot;i;i--){ (ans*=i)%=MOD; } printf("%lld\n",ans); return 0; } /* */
本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系我们删除。