#include #include using namespace std; using mint=atcoder::modint998244353; vector fact,ifact; void factcalc(int n){ fact.assign(n+1,0); ifact.assign(n+1,0); fact[0]=1;ifact[0]=1; for (int i=1;i<=n;i++){ fact[i]=fact[i-1]*i; ifact[i]=ifact[i-1]*mint(i).inv(); } } mint comb(int n,int k){ if (n>n>>s>>t; s--;t--; factcalc(n+10); vector> g(n); vector> edge(n-1); for (int i=0;i>u>>v; u--;v--; g[u].push_back(i); g[v].push_back(i); edge[i]={u,v}; } vector vec; auto dfs=[&](auto dfs,int v,int par)-> bool { if (par==t) return true; for (int i:g[v]){ if (i==par) continue; auto [u1,u2]=edge[i]; int u=u1^u2^v; if (dfs(dfs,u,i)){ int c=(int)g[v].size()-2; if (c>=0) vec.push_back(c); return true; } } return false; }; auto [v1,v2]=edge[s]; dfs(dfs,v1,s); dfs(dfs,v2,s); deque>> q; for (int c:vec){ vector f(c+2); for (int i=1;i<=c+1;i++) f[i]=comb(c,i-1)*fact[i-1]; q.push_front({c+1,f}); } while (q.size()>1){ auto [c1,f1]=q.front(); q.pop_front(); auto [c2,f2]=q.front(); q.pop_front(); q.push_back({c1+c2,atcoder::convolution(f1,f2)}); } auto [c,f]=q.front(); for (int k=0;kc) cout<<0<<" \n"[k==n-1]; else cout<