Problem:
Score : 1900 points

Problem Statement

#nck {
width: 30px;
height: auto;
}

One day, Takahashi was given the following problem from Aoki:

You are given a tree with N vertices and an integer K. The vertices are numbered 1 through N. The edges are represented by pairs of integers (a_i, b_i).

For a set S of vertices in the tree, let f(S) be the minimum number of the vertices in a subtree of the given tree that contains all vertices in S.

There are ways to choose K vertices from the trees. For each of them, let S be the set of the chosen vertices, and find the sum of f(S) over all ways.

Since the answer may be extremely large, print it modulo 924844033(prime).

Since it was too easy for him, he decided to solve this problem for all K = 1,2,...,N.

Constraints

2 ≦ N ≦ 200,000

1 ≦ a_i, b_i ≦ N

The given graph is a tree.

Input

The input is given from Standard Input in the following format:

N
a_1 b_1
a_2 b_2
:
a_{N-1} b_{N-1}

Output

Print N lines. The i-th line should contain the answer to the problem where K=i, modulo 924844033.

Sample Input 1

3
1 2
2 3

Sample Output 1

3
7
3

The diagram above illustrates the case where K=2. The chosen vertices are colored pink, and the subtrees with the minimum number of vertices are enclosed by red lines.

Sample Input 2

4
1 2
1 3
1 4

Sample Output 2

4
15
13
4

Sample Input 3

7
1 2
2 3
2 4
4 5
4 6
6 7

Sample Output 3

7
67
150
179
122
45
7

Solution in C# (.NET Core 3.1.201) (judge verdict: Accepted)

using System;
using System.Collections.Generic;
using System.Linq;
using System.IO;
using System.Text;
using System.Numerics;
using System.Threading;
using System.Runtime.CompilerServices;
using static System.Math;
using static System.Array;
using static AtCoder.Sc_out;
using static AtCoder.Tool;
using static AtCoder.ModInt;
namespace AtCoder
{
    class AC
    {
        const int MOD = 1000000007;
        //const int MOD = 998244353;

        const int INF = int.MaxValue / 2;
        const long SINF = long.MaxValue / 2;
        const double EPS = 1e-8;
        static readonly int[] dI = { 0, 1, 0, -1, 1, -1, -1, 1 };
        static readonly int[] dJ = { 1, 0, -1, 0, 1, 1, -1, -1 };
        //static List<List<int>> G = new List<List<int>>();
        //static List<List<Edge>> G = new List<List<Edge>>();
        //static List<Edge> E = new List<Edge>();
        static void Main(string[] args)
        {
            var sw = new StreamWriter(Console.OpenStandardOutput()) { AutoFlush = false }; Console.SetOut(sw);

            var th = new Thread(Run, 1 << 26);
            th.Start();
            th.Join();

            //Run();
            Console.Out.Flush();
        }
        static void Run()
        {
            int Testcase = 1;
            for (var _ = 0; _ < Testcase; _++) Solve();
        }
        static void Solve()
        {
            var mod = 924844033;
            var calc = new Math_NTT(mod, 5);
            int N = Cin.Int;
            var G = new List<List<int>>();
            for (var i = 0; i < N; i++) G.Add(new List<int>());
            for (var i = 0; i < N - 1; i++)
            {
                int a, b;
                Cin.Input(out a, out b);
                a--; b--;
                G[a].Add(b);
                G[b].Add(a);
            }
            var F = new long[2 * N + 1];
            F[0] = 1; for (var i = 1; i <= 2 * N; i++) F[i] = (F[i - 1] * i) % mod;
            var dp = new long[N];
            long dfs(int v, int prev)
            {
                if (dp[v] != 0) return dp[v];
                long ret = 1;
                foreach (var nx in G[v])
                {
                    if (nx == prev) continue;
                    ret += dfs(nx, v);
                }
                dp[v] = ret;
                return ret;
            }
            dfs(0, -1);
            var k = new long[N + 1];
            for (var i = 0; i < N; i++)
            {
                k[dp[i]]++;
                k[N - dp[i]]++;
            }
            //Out_Sep(k);
            var p = new long[N + 1];
            var q = new long[N + 1];
            for (var i = 1; i <= N; i++) p[i] = (k[i] * F[i]) % mod;
            for (var i = 1; i <= N; i++) q[i] = calc.inverse(F[N - i]);

            var ans = calc.Convolution_NTT(p, q);
            //Out_Sep(ans);
            for (var i = N + 1; i <= 2 * N; i++)
            {
                ans[i] *= calc.inverse(F[i - N]);
                ans[i] %= mod;
            }
            long W = N + 1;
            for (var i = N + 1; i <= 2 * N; i++)
            {
                var K = i - N;
                W = (W * (N - K + 1)) % mod * calc.inverse(K) % mod;
                ans[i] = W - ans[i] + mod;
                ans[i] %= mod;
                OutL(ans[i]);
            }
        }
        public struct Edge
        {
            public int from;

            public int to;
            public long dist;

            public Edge(int t, long c)
            {
                from = -1;
                to = t;
                dist = c;
            }
            public Edge(int f, int t, long c)
            {
                from = f;
                to = t;
                dist = c;
            }
        }
    }
    public class Math_NTT
    {
        private long mod;
        private long root;
        public Math_NTT(long prime_mod, long premitive_root) { mod = prime_mod; root = premitive_root; }
        [MethodImpl(MethodImplOptions.AggressiveInlining)]
        public long modpow(long x, long nn) => nn == 0 ? 1 : (nn % 2 == 0 ? modpow((x * x) % mod, nn / 2) : (x * modpow(x, nn - 1)) % mod);
        [MethodImpl(MethodImplOptions.AggressiveInlining)]
        public long inverse(long x) => modpow(x, mod - 2);
        [MethodImpl(MethodImplOptions.AggressiveInlining)]
        void NTT(ref long[] a, bool rev = false)
        {
            var n = (long)a.Length;
            if (n == 1) return;
            var b = new long[n];
            var s = modpow(root, rev ? (mod - 1 - (mod - 1) / n) : (mod - 1) / n);
            var kp = Enumerable.Repeat((long)1, (int)(n / 2 + 1)).ToArray();
            long i, j, k, l, r;
            for (i = 0; i < n / 2; ++i) kp[i + 1] = (kp[i] * s) % mod;
            for (i = 1, l = n / 2; i < n; i <<= 1, l >>= 1)
            {
                for (j = 0, r = 0; j < l; ++j, r += i)
                {
                    for (k = 0, s = kp[i * j]; k < i; ++k)
                    {
                        var p = a[k + r]; var q = a[k + r + n / 2];
                        b[k + 2 * r] = (p + q) % mod;
                        b[k + 2 * r + i] = ((p - q + mod) % mod * s) % mod;
                    }
                }
                var t = a; a = b; b = t;
            }
            if (rev)
            {
                s = inverse(n);
                for (i = 0; i < n; ++i) a[i] = (a[i] * s) % mod;
            }
        }
        [MethodImpl(MethodImplOptions.AggressiveInlining)]
        public long[] Convolution_NTT(long[] a, long[] b)
        {
            int N = a.Length + b.Length - 1;
            int t = 1;
            while (t < N) t <<= 1;
            var nxa = new long[t];
            var nxb = new long[t];
            for (var i = 0; i < t; i++)
            {
                nxa[i] = i < a.Length ? a[i] : 0;
                nxb[i] = i < b.Length ? b[i] : 0;
            }
            NTT(ref nxa);
            NTT(ref nxb);
            for (var i = 0; i < t; i++) nxa[i] = (nxa[i] * nxb[i]) % mod;
            NTT(ref nxa, true);
            var ret = new long[N];
            for (var i = 0; i < N; i++) ret[i] = nxa[i];
            return ret;
        }
    }
    struct ModInt
    {
        public long value;
        private const int MOD = 1000000007;
        //private const int MOD = 998244353;
        public ModInt(long value) { this.value = value; }
        public static implicit operator ModInt(long a)
        {
            var ret = a % MOD;
            return new ModInt(ret < 0 ? (ret + MOD) : ret);
        }
        public static ModInt operator +(ModInt a, ModInt b) => (a.value + b.value);
        public static ModInt operator -(ModInt a, ModInt b) => (a.value - b.value);
        public static ModInt operator *(ModInt a, ModInt b) => (a.value * b.value);
        public static ModInt operator /(ModInt a, ModInt b) => a * Modpow(b, MOD - 2);
        public static ModInt operator <<(ModInt a, int n) => (a.value << n);
        public static ModInt operator >>(ModInt a, int n) => (a.value >> n);
        public static ModInt operator ++(ModInt a) => a.value + 1;
        public static ModInt operator --(ModInt a) => a.value - 1;
        [MethodImpl(MethodImplOptions.AggressiveInlining)]
        public static ModInt Modpow(ModInt a, long n)
        {
            var k = a;
            ModInt ret = 1;
            while (n > 0)
            {
                if ((n & 1) != 0) ret *= k;
                k *= k;
                n >>= 1;
            }
            return ret;
        }
        private static readonly List<long> Factorials = new List<long>() { 1 };
        [MethodImpl(MethodImplOptions.AggressiveInlining)]
        public static ModInt Fac(long n)
        {
            for (var i = Factorials.Count(); i <= n; i++)
            {
                Factorials.Add((Factorials[i - 1] * i) % MOD);
            }
            return Factorials[(int)n];
        }
        [MethodImpl(MethodImplOptions.AggressiveInlining)]
        public static ModInt nCr(long n, long r)
        {
            return n < r ? 0 : Fac(n) / (Fac(r) * Fac(n - r));
        }
        public static explicit operator int(ModInt a) => (int)a.value;
    }
    static class Cin
    {
        public static string[] ReadSplit => Console.ReadLine().Split();
        public static int[] ReadSplitInt => ConvertAll(Console.ReadLine().Split(), int.Parse);
        public static long[] ReadSplitLong => ConvertAll(Console.ReadLine().Split(), long.Parse);
        public static double[] ReadSplit_Double => ConvertAll(Console.ReadLine().Split(), double.Parse);
        public static string Str => Console.ReadLine();
        public static int Int => int.Parse(Console.ReadLine());
        public static long Long => long.Parse(Console.ReadLine());
        public static double Double => double.Parse(Console.ReadLine());
        public static T Conv<T>(string input)
        {
            if (typeof(T).Equals(typeof(ModInt)))
            {
                return (T)(dynamic)(long.Parse(input));
            }
            return (T)Convert.ChangeType(input, typeof(T));
        }
        public static void Input<T>(out T a) => a = Conv<T>(Console.ReadLine());
        public static void Input<T, U>(out T a, out U b)
        { var q = ReadSplit; a = Conv<T>(q[0]); b = Conv<U>(q[1]); }
        public static void Input<T, U, V>(out T a, out U b, out V c)
        { var q = ReadSplit; a = Conv<T>(q[0]); b = Conv<U>(q[1]); c = Conv<V>(q[2]); }
        public static void Input<T, U, V, W>(out T a, out U b, out V c, out W d)
        { var q = ReadSplit; a = Conv<T>(q[0]); b = Conv<U>(q[1]); c = Conv<V>(q[2]); d = Conv<W>(q[3]); }
        public static void Input<T, U, V, W, X>(out T a, out U b, out V c, out W d, out X e)
        { var q = ReadSplit; a = Conv<T>(q[0]); b = Conv<U>(q[1]); c = Conv<V>(q[2]); d = Conv<W>(q[3]); e = Conv<X>(q[4]); }
    }
    static class Sc_out
    {
        public static void OutL(object s) => Console.WriteLine(s);
        public static void Out_Sep<T>(IEnumerable<T> s) => Console.WriteLine(string.Join(" ", s));
        public static void Out_Sep<T>(IEnumerable<T> s, string sep) => Console.WriteLine(string.Join($"{sep}", s));
        public static void Out_Sep(params object[] s) => Console.WriteLine(string.Join(" ", s));
        public static void Out_One(object s) => Console.Write($"{s} ");
        public static void Out_One(object s, string sep) => Console.Write($"{s}{sep}");
        public static void Endl() => Console.WriteLine();
    }
    public static class Tool
    {
        static public void Initialize<T>(ref T[] array, T initialvalue)
        {
            array = ConvertAll(array, x => initialvalue);
        }
        static public void Swap<T>(ref T a, ref T b)
        {
            T keep = a;
            a = b;
            b = keep;
        }
        static public void Display<T>(T[,] array2d, int n, int m)
        {
            for (var i = 0; i < n; i++)
            {
                for (var j = 0; j < m; j++)
                {
                    Console.Write($"{array2d[i, j]} ");
                }
                Console.WriteLine();
            }
        }
        static public long Gcd(long a, long b)
        {
            if (a == 0 || b == 0) return Max(a, b);
            return a % b == 0 ? b : Gcd(b, a % b);
        }
        static public long LPow(int a, int b) => (long)Pow(a, b);
        static public bool Bit(long x, int dig) => ((1L << dig) & x) != 0;
        static public int Sig(long a) => a == 0 ? 0 : (int)(a / Abs(a));
    }
}