提交时间:2024-08-30 22:28:35
运行 ID: 32068
#include<bits/stdc++.h> #define up(i,l,r) for(int i=(l);i<=(r);++i) #define down(i,l,r) for(int i=(l);i>=(r);--i) #define p_b push_back #define m_p make_pair #define pi pair<int,int> #define p1 first #define p2 second using namespace std; typedef long long ll; const int maxn=4e5+10,mod=998244353; const ll inf=1e18; inline ll read(){ ll x=0;short t=1;char ch=getchar(); while(ch<'0'||ch>'9'){if(ch=='-')t=-1;ch=getchar();} while(ch>='0'&&ch<='9')x=x*10+ch-'0',ch=getchar(); return x*t; }int n;vector<int>vec[maxn],v[maxn]; int B[maxn],len[maxn],siz[maxn],dp[maxn]; void dfs(int u,int fa){ siz[u]=1; for(int x:vec[u])if(x!=fa)v[u].p_b(x),dfs(x,u),B[u]=B[x],len[u]=len[x]+1,siz[u]+=siz[x]; if(v[u].size()>=2){ B[u]=u,len[u]=0; } } int dp1(int x); int dp2(int x,int y); int dp1(int x){ if(dp[x]!=-1)return dp[x]; if(siz[x]&1)return 0; if(v[x].size()>2)return 0; if(!B[x])return siz[x]/2; int a=v[B[x]][0],b=v[B[x]][1],res=0; up(i,0,1){ if(v[a].size()==1)(res+=dp2(v[a][0],b))%=mod; if(!B[a]){ if(len[a]<=len[x]){ int val=dp1(b);if(len[a]!=len[x])(val<<=1)%=mod; (res+=val)%=mod; } } if(v[a].size()==2){ if((!B[v[a][0]])&&len[v[a][0]]<=len[x])(res+=dp2(v[a][1],b))%=mod; if((!B[v[a][1]])&&len[v[a][1]]<=len[x])(res+=dp2(v[a][0],b))%=mod; } swap(a,b); }return dp[x]=res; }int dp2(int x,int y){ if((!x)||(!y))return dp1(x|y); if((siz[x]+siz[y])&1)return 0; if(v[x].size()>1||v[y].size()>1)return 0; if(v[x].empty()&&v[y].empty())return 1; if(v[x].empty())return dp1(v[y][0]); if(v[y].empty())return dp1(v[x][0]); return dp2(v[x][0],v[y][0]); } void slv(){ memset(dp,-1,sizeof(dp)); n=read();up(i,1,2*n-1){ int x=read(),y=read(); vec[x].p_b(y),vec[y].p_b(x); }if(n==1){ cout<<"2";return; } int rt=0; up(i,1,2*n){ if(vec[i].size()>3){ cout<<"0";return; }if(vec[i].size()==3)rt=i; }if(!rt){ cout<<(2ll*n*n-2*n+4)%mod;return; }dfs(rt,0);int res=0; sort(v[rt].begin(),v[rt].end()); do { int a=v[rt][0],b=v[rt][1],c=v[rt][2]; if(v[b].empty())(res+=dp1(a)*1ll*dp1(c)%mod)%=mod; if(v[b].size()==1){ (res+=dp2(v[b][0],a)*1ll*dp1(c)%mod)%=mod; (res+=dp2(v[b][0],c)*1ll*dp1(a)%mod)%=mod; }if(v[b].size()==2){ (res+=dp2(v[b][0],a)*1ll*dp2(v[b][1],c)%mod)%=mod; (res+=dp2(v[b][0],c)*1ll*dp2(v[b][1],a)%mod)%=mod; } }while(next_permutation(v[rt].begin(),v[rt].end())); (res<<=1)%=mod;cout<<res; } int main(){ //freopen("1.in","r",stdin),freopen("1.out","w",stdout); //int t=read();while(t--)slv(); slv(); return 0; }