排队

题解:

结论:

可以看出,如果相互连通可以排成全排。

那么处理出全排数,用并查集计算连通块个数,与连通块点数

即答案为,,

标程:

#include <iostream>
using namespace std;
typedef long long ll;
const int N=1e5+7;
const ll mod=998244353;
int n,m;
ll f[N],vex[N],p[N];
void init(){
    for(int i=1;i<=n;i++){
        f[i]=i,vex[i]=1;
    }
    p[0]=1;
    for(int i=1;i<=n;i++){
        p[i]=p[i-1]*(ll)i%mod;
    }
}
int fin(int x){return f[x]==x? x:f[x]=fin(f[x]);}
void bing(int x,int y){
    int f1=fin(x),f2=fin(y);
    if(f1==f2) return;
    f[f2]=f1;
    vex[f1]+=vex[f2];
}
int main(){
    cin>>n>>m;
    init();
    for(int i=1;i<=m;i++){
        int u,v;
        cin>>u>>v;
        bing(u,v);
    }
    ll ans=1;
    for(int i=1;i<=n;i++){
        if(fin(i)==i) ans=ans*p[vex[i]]%mod;
    }
    cout<<ans<<"\n";
}