记录编号 611365 评测结果 AAAAAAAAAAAAA
题目名称 [THUPC 2025 Final] I’m Here 最终得分 100
用户昵称 GravatarLikableP 是否通过 通过
代码语言 C++ 运行时间 9.898 s
提交时间 2026-01-28 23:08:05 内存使用 55.22 MiB
显示代码纯文本
#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;
}