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



京公网安备 11010502036488号