1 solutions

  • 0
    @ 2025-11-5 18:06:59

    C++ :

    #include<iostream>
    #include<cmath>
    #include<cstring>
    #include<stdio.h>
    #include<algorithm>
    #include<cassert>
    using namespace std;
    const int N=500100,mo=998244353;
    struct bian{
    	int next,point;
    }b[N<<2];
    int p[N],len,n,m,father[N],num[N],d[N],a[N],f[N];
    void ade(int k1,int k2){
    	b[++len]=(bian){p[k1],k2}; p[k1]=len;
    }
    void add(int k1,int k2){
    	ade(k1,k2); ade(k2,k1);
    }
    void dfs(int k1){
    	for (int i=p[k1];i!=-1;i=b[i].next){
    		int j=b[i].point;
    		if (d[j]==0){
    			father[j]=k1; d[j]=d[k1]+1; dfs(j);
    		}
    	}
    }
    int dp[N];
    int compare(int k1,int k2){
    	return d[k1]<d[k2];
    }
    void getans(int k1,int flag=0){
    	num[k1]=-1; dp[k1]=1; int tot=0;
    	for (int i=p[k1];i!=-1;i=b[i].next){
    		int j=b[i].point;
    		if (num[j]==1){
    			getans(j); dp[k1]=1ll*dp[k1]*dp[j]%mo; tot++;
    		}
    	}
    	if (tot==0) return;
    	if (flag==0)
    		dp[k1]=1ll*dp[k1]*(f[tot]+1ll*tot*f[tot-1]%mo)%mo;
    	else dp[k1]=1ll*dp[k1]*f[tot]%mo;
    }
    int getfather(int k1){
    	if (a[k1]==k1) return k1; return a[k1]=getfather(a[k1]);
    }
    void solve(){
    	scanf("%d%d",&n,&m);
    	for (int i=1;i<=n;i++) p[i]=-1,father[i]=num[i]=d[i]=0,a[i]=i;
    	len=-1;
    	for (int i=1;i<=m;i++){
    		int k1,k2; scanf("%d%d",&k1,&k2); add(k1,k2); //a[getfather(k1)]=getfather(k2);
    	}
    /*	for (int i=1;i<=n;i++){
    		assert(getfather(i)==getfather(1));
    	}
    	for (int i=1;i<=n;i++) a[i]=i;*/
    	d[1]=1; dfs(1); sort(a+1,a+n+1,compare);
    //	cout<<"asd"<<endl;
    //	for (int i=1;i<=n;i++) cout<<father[i]<<" "; cout<<endl;
    	for (int i=1;i<=m;i++){
    		int u=b[(i-1)<<1].point,v=b[(i<<1)-1].point;
    		if (d[u]<d[v]) swap(u,v);
    //		cout<<u<<" "<<v<<endl;
    		while (u!=v){
    			num[u]++;
    			if (num[u]>2){
    				printf("0\n"); return;
    			}		 
    			u=father[u];
    		}
    	}
    	int ans=1;
    	for (int i=1;i<=n;i++)
    		if (num[a[i]]!=-1){
    		//	cout<<"fa "<<a[i]<<endl;
    			getans(a[i],1); ans=1ll*ans*dp[a[i]]%mo;
    		}
    	printf("%d\n",ans);
    }
    int main(){
    	//freopen("cactus.in","r",stdin);
    	//freopen("cactus.out","w",stdout);
    	f[0]=1; f[1]=1;
    	for (int i=2;i<=500000;i++) f[i]=(f[i-1]+1ll*(i-1)*f[i-2])%mo;
    	int t; scanf("%d",&t);
    	for (;t;t--){
    		solve();
    	}
    	return 0;
    }
    
    
    • 1

    Information

    ID
    18790
    Time
    1000ms
    Memory
    512MiB
    Difficulty
    (None)
    Tags
    # Submissions
    0
    Accepted
    0
    Uploaded By