显示代码纯文本
#include<iostream>
#include<cstdio>
#include<cstring>
#include<vector>
#include<algorithm>
using namespace std;
const int mod=998244353;
int n,x,y,tot,fir[85],nxt[165],to[165],siz[85];vector<int> son[85];
int fac[85],inv[85],dp[85][85],f[81][81][81][81],zy[81][81][81][81],nf[81][81][81];
int ksm(int d,int cf)
{
int ans=1;
while(cf)
{
if(cf&1) ans=1ll*ans*d%mod;
d=1ll*d*d%mod;cf>>=1;
}
return ans;
}
void init(int n)
{
fac[0]=1;for(int i=1;i<=n;i++) fac[i]=1ll*fac[i-1]*i%mod;
inv[n]=ksm(fac[n],mod-2);for(int i=n-1;i>=0;i--) inv[i]=1ll*inv[i+1]*(i+1)%mod;
}
int C(int n,int m){return 1ll*fac[n]*inv[m]%mod*inv[n-m]%mod;}
bool cmp(int x,int y){return x>y;}
void ins(int x,int y)
{
nxt[++tot]=fir[x];
fir[x]=tot;
to[tot]=y;
}
void dfs1(int now,int fa)
{
dp[now][0]=1;
for(int i=fir[now];i;i=nxt[i])
if(to[i]!=fa)
{
son[now].push_back(to[i]);dfs1(to[i],now);
for(int j=siz[now];j>=0;j--)
for(int k=siz[to[i]];k>=1;k--)
(dp[now][j+k]+=1ll*dp[now][j]*dp[to[i]][k]%mod*C(j+k,k)%mod)%=mod;
siz[now]+=siz[to[i]];
}
for(int i=siz[now];i>=0;i--) (dp[now][i+1]+=dp[now][i])%=mod;
siz[now]++;
}
void dfs2(int now)
{
f[now][0][0][0]=1;int cs=0,mnow=now+siz[now]-1;
for(int i=0;i<son[now].size();i++)
{
int to=son[now][i];dfs2(to);
int mto=to+siz[to]-1;
for(int sj=0;sj<=siz[to];sj++)
for(int sk=0;sk<=siz[to];sk++)
for(int j=0;j<=cs;j++)
for(int k=0;k<=cs;k++)
for(int l=0;l<=min(j,sk);l++)
{
int nj=j+sj-l,nk=k+sk-l;
int tmp=1ll*C(j,l)*C(nk,k)%mod*f[now][0][j][k]%mod;
(zy[sj][sk][nj][nk]+=tmp)%=mod;
}
for(int sj=0;sj<=siz[to];sj++)
for(int sk=0;sk<=siz[to];sk++)
for(int nj=0;nj<=cs+siz[to];nj++)
for(int nk=0;nk<=cs+siz[to];nk++)
{
int tmp=zy[sj][sk][nj][nk];if(!tmp) continue;
(nf[now][nj][nk]+=1ll*tmp*f[to][0][sj][sk]%mod)%=mod;
for(int o=to;o<=mto;o++)
(f[now][o][nj][nk]+=1ll*tmp*f[to][o][sj][sk]%mod)%=mod;
zy[sj][sk][nj][nk]=0;
}
memcpy(f[now][0],nf[now],sizeof(nf[now]));memset(nf[now],0,sizeof(nf[now]));
for(int o=mto+1;o<=mnow;o++)
{
for(int j=o-mto-1;j<=cs-1;j++)
for(int k=0;k<=cs;k++)
for(int sk=0;sk<=siz[to];sk++)
for(int l=0;l<=min(j-(o-mto-1),sk);l++)
{
int rj=j-(o-mto-1),nj=j+siz[to]-l,nk=k+sk-l;
int tmp=1ll*C(rj,l)*C(nk,k)%mod*f[now][o][j][k]%mod;
(nf[now][nj][nk]+=1ll*tmp*dp[to][sk]%mod)%=mod;
}
memcpy(f[now][o],nf[now],sizeof(nf[now]));memset(nf[now],0,sizeof(nf[now]));
}
cs+=siz[to];
}
if(now==1) return;
for(int j=cs;j>=0;j--)
for(int k=cs;k>=0;k--)
{
int ts=0;
for(int i=mnow;i>=now;i--)
{
int tmp=f[now][i][j][k];
(f[now][i][j+1][k]+=tmp)%=mod;
if(j==cs-1) (f[now][i][cs][k+1]+=tmp)%=mod;
f[now][i][j][k]=ts;(ts+=tmp)%=mod;
}
int tmp=f[now][0][j][k];
(f[now][now][j][k]+=tmp)%=mod,(f[now][0][j+1][k]+=(tmp+ts)%mod)%=mod;
if(j==cs) (f[now][now][cs][k+1]+=tmp)%=mod,(f[now][0][cs+1][k+1]+=tmp)%=mod;
}
}
int main()
{
freopen("thupc_2025_ImHere.in", "r", stdin);
freopen("thupc_2025_ImHere.out", "w", stdout);
cin>>n;
init(n);
for(int i=1;i<n;i++)
{
cin>>x>>y;
ins(x,y);ins(y,x);
}
dfs1(1,0);
for(int i=1;i<=n;i++) sort(son[i].begin(),son[i].end(),cmp);
dfs2(1);
for(int i=n;i>=2;i--) cout<<f[1][i][i-2][0]<<" ";cout<<"1";
return 0;
}