提交时间:2025-05-07 13:59:12

运行 ID: 37739

#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 pi pair<int,int> #define p1 first #define p2 second #define m_p make_pair #define p_b push_back using namespace std; typedef long long ll; const int maxn=1e5+10,mod=998244353; 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>E[maxn]; int S1[5005],S2[5005],S3[5005],S4[5005]; int SS1[5005],SS2[5005],SS3[5005],SS4[5005]; int f[5005][5005][2][2]; int ans[5005],tmp[5005][2][2],siz[5005]; int ff[5005][2]; inline int add(int a,int b){if((a+=b)>=mod)a-=mod;return a;} inline int add(int a,int b,int c){return add(add(a,b),c);} inline int add(int a,int b,int c,int d){return add(add(a,b),add(c,d));} void dfs(int u,int fa){ vector<int>son;siz[u]=1;f[u][0][0][0]=1; for(int x:E[u])if(x!=fa)dfs(x,u); memset(S1,0,sizeof(S1)); memset(S2,0,sizeof(S2)); memset(S3,0,sizeof(S3)); memset(S4,0,sizeof(S4)); for(int x:E[u])if(x!=fa){ memset(SS1,0,sizeof(SS1)); memset(SS2,0,sizeof(SS2)); memset(SS3,0,sizeof(SS3)); memset(SS4,0,sizeof(SS4)); up(i,0,siz[u]+siz[x])up(j,0,1)up(k,0,1)tmp[i][j][k]=0; up(i,0,siz[u])up(j,0,siz[x])up(p,0,1)up(q,0,1)up(r,0,1)up(s,0,1){ tmp[i+j][p][q]=add(tmp[i+j][p][q],f[u][i][p][q]*1ll*f[x][j][r][s]%mod); } up(i,0,siz[u])up(j,0,siz[x])up(r,0,1)up(s,0,0){ tmp[i+j+1][1][0]=add(tmp[i+j+1][1][0],f[u][i][0][0]*1ll*f[x][j][r][s]%mod); } up(i,0,siz[u])up(j,0,siz[x])up(r,0,0)up(s,0,1){ tmp[i+j+1][0][1]=add(tmp[i+j+1][0][1],f[u][i][0][0]*1ll*f[x][j][r][s]%mod); } up(i,0,siz[u])up(j,0,siz[x]){ tmp[i+j+2][1][1]=add(tmp[i+j+2][1][1],S1[i]*1ll*add(f[x][j][0][0],f[x][j][0][1],f[x][j][1][0])%mod); tmp[i+j+2][1][1]=add(tmp[i+j+2][1][1],S2[i]*1ll*f[x][j][0][1]%mod); tmp[i+j+2][1][1]=add(tmp[i+j+2][1][1],S3[i]*1ll*f[x][j][1][0]%mod); tmp[i+j+2][1][1]=add(tmp[i+j+2][1][1],S4[i]*1ll*f[x][j][0][0]%mod); } up(i,0,siz[u])up(j,0,siz[x]){ int v=add(f[x][j][0][0],f[x][j][0][1],f[x][j][1][0],f[x][j][1][1]); SS1[i+j]=add(SS1[i+j],S1[i]*1ll*v%mod); SS2[i+j]=add(SS2[i+j],S2[i]*1ll*v%mod); SS3[i+j]=add(SS3[i+j],S3[i]*1ll*v%mod); SS4[i+j]=add(SS4[i+j],S4[i]*1ll*v%mod); } up(i,0,siz[u])up(j,0,siz[x]){ SS1[i+j]=add(SS1[i+j],f[u][i][0][0]*1ll*add(f[x][j][0][0],f[x][j][0][1],f[x][j][1][0])%mod); SS2[i+j]=add(SS2[i+j],mod-f[u][i][0][0]*1ll*f[x][j][0][1]%mod); SS3[i+j]=add(SS3[i+j],mod-f[u][i][0][0]*1ll*f[x][j][1][0]%mod); SS4[i+j]=add(SS4[i+j],f[u][i][0][0]*1ll*f[x][j][0][0]%mod); } memcpy(S1,SS1,sizeof(S1)); memcpy(S2,SS2,sizeof(S2)); memcpy(S3,SS3,sizeof(S3)); memcpy(S4,SS4,sizeof(S4)); siz[u]+=siz[x]; up(i,0,siz[u])up(p,0,1)up(q,0,1)f[u][i][p][q]=tmp[i][p][q]; } //up(i,0,siz[u])up(p,0,1)up(q,0,1)printf("f[%d][%d][%d][%d]=%d\n",u,i,p,q,f[u][i][p][q]); } int jc[maxn]; void slv(){ n=read(); jc[0]=1;up(i,1,n)jc[i]=jc[i-1]*1ll*i%mod; up(i,1,n-1){ int x=read(),y=read(); E[x].p_b(y),E[y].p_b(x); } dfs(1,0);int res=0; up(i,0,n-1){ int x=add(f[1][i][0][0],f[1][i][0][1],f[1][i][1][0],f[1][i][1][1])*1ll*jc[n-i]%mod; if(i&1)x=mod-x; res=add(res,x); }cout<<res; } int main(){ //freopen("mission.in","r",stdin),freopen("mission.out","w",stdout); slv(); return 0; }