#include <cstdio>
#include <algorithm>
#include <cstring>
#include <cctype>
#include <vector>
using namespace std;
typedef long long int64;
inline int read(int f = 1, int x = 0, char ch = ' ')
{
    while(!isdigit(ch = getchar())) if(ch == '-') f = -1;
    while(isdigit(ch)) x = x*10+ch-'0', ch = getchar();
    return f*x;
}
const int N = 2e5+5, P = 924844033;
struct Edge
{
    int next, to;
    Edge(int next = 0, int to = 0):next(next), to(to) {}; 
}edge[N<<1];
int tot, head[N];
void _add(int x, int y) { edge[++tot] = Edge(head[x], y); head[x] = tot; }
void add(int x, int y) { _add(x, y), _add(y, x); }
int n, s[N];
void dfs(int x, int fa)
{
    s[x] = 1;
    for(int i = head[x]; i; i = edge[i].next)
    {
        int y = edge[i].to; if(y == fa) continue;
        dfs(y, x); s[x] += s[y];
    }
}
int64 qpow(int64 a, int b)
{
    int64 ret = 1;
    for( ; b; b >>= 1, a = a*a%P) if(b&1) ret = a*ret%P;
    return ret;
}
int64 fac[N], inv[N<<2], ifac[N];
int64 C(int n, int m) { return n < m?0:fac[n]*ifac[m]%P*ifac[n-m]%P; }
struct Poly
{
    vector<int> _;
    inline int& operator [] (int i) { return _[i]; }
    inline int ti() { return _.size()-1; }
    inline void set(int ti) { _.resize(ti+1); }
    inline void rev() { reverse(_.begin(), _.end()); }
};
int lim;
int64 w[2][N<<2];
void prepare(int ti)
{
    for(lim = 1; lim <= ti; lim <<= 1);
    w[0][0] = w[1][0] = w[0][lim] = w[1][lim] = 1;
    int64 g = qpow(5, (P-1)/lim);
    for(int i = 1; i < lim; ++i) w[1][lim-i] = w[0][i] = w[0][i-1]*g%P;
}
void NTT(Poly &A, int t)
{
    if(!t) A.set(lim-1);
    for(int i = 0, j = 0; i < lim; ++i)
    {
        if(i > j) A[i] ^= A[j] ^= A[i] ^= A[j];
        for(int k = lim>>1; (j ^= k) < k; k >>= 1);
    }
    for(int mid = 1; mid < lim; mid <<= 1)
        for(int len = mid<<1, j = 0; j < lim; j += len)
            for(int k = 0, p = 0, q = lim/len; k < mid; ++k, p += q)
            {
                int64 x = A[j+k], y = w[t][p]*A[j+k+mid]%P;
                A[j+k] = x+y<P?x+y:x+y-P;
                A[j+k+mid] = x-y<0?x-y+P:x-y;
            }
    if(!t) return; int64 v = inv[lim];
    for(int i = 0; i < lim; ++i) A[i] = A[i]*v%P;
}
Poly operator * (Poly A, Poly B)
{
    int n = A.ti(), m = B.ti(); 
    if(n <= 128||m <= 128)
    {
        Poly C; C.set(n+m);
        int *c = &C[0], *a = &A[0], *b = &B[0];
        for(int i = 0; i <= n; ++i)
        {
            int *f = c+i; int64 x = a[i];
            for(int j = 0; j <= m; ++j) f[j] = (f[j]+x*b[j]%P)%P;
        }
        return C;
    }
    prepare(n+m), NTT(A, 0), NTT(B, 0);
    for(int i = 0; i < lim; ++i) A[i] = 1ll*A[i]*B[i]%P;
    NTT(A, 1); A.set(n+m);
    return A;
}
Poly F, G;
int px[N<<1], py[N<<1];
int main()
{
    for(int i = 1; i <= N<<2; i <<= 1) inv[i] = qpow(i, P-2);
    n = read(), fac[0] = fac[1] = ifac[0] = ifac[1] = 1;
    for(int i = 1; i < n; ++i)
    {
        int x = read(), y = read();
        add(x, y);
    }
    dfs(1, 0); F.set(n), G.set(n);
    for(int i = 2; i <= n; ++i) 
    {
        inv[i] = (P-P/i)*inv[P%i]%P, 
        fac[i] = i*fac[i-1]%P, 
        ifac[i] = inv[i]*ifac[i-1]%P;
        ++F[s[i]], ++F[n-s[i]];
    }
    for(int i = 0; i <= n; ++i) F[i] = F[i]*fac[i]%P, G[i] = ifac[i]%P;
    F.rev(), F = F*G, F.set(n), F.rev();
    for(int i = 1; i <= n; ++i) printf("%lld\n", (n*C(n, i)%P-F[i]*ifac[i]%P+P)%P);
    return 0;
}
/* 
3
1 1
2 4
3 9
*/

Measured memory_bytes: 42352