排队
题解:
结论:
可以看出,如果相互连通可以排成全排。
那么处理出全排数,用并查集计算连通块个数,与连通块点数。
即答案为,,
标程:
#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"; }