#include <stdio.h>
#include <algorithm>
#include <vector>
using namespace std;
const int maxL = 18;
const int maxN = 1 << maxL;
const long long mod = 924844033;
long long generator = 5;
long long root[maxN], invroot[maxN];
long long inv[maxN], fact[maxN], ifact[maxN];
int rev[maxL+1][maxN];
inline long long add(long long a, long long b)
{
a += b;
if (a >= mod)
a -= mod;
return a;
}
inline long long mul(long long a, long long b)
{
return a * b % mod;
}
long long fpow(long long a, long long p)
{
a %= mod;
p = (p % (mod - 1) + mod - 1) % (mod - 1);
long long r = 1;
while (p){
if (p & 1) r = r * a % mod;
a = a * a % mod;
p >>= 1;
}
return r;
}
int get_rev(int a, int u)
{
int r = 0;
u--;
while (u){
r <<= 1;
r += a & 1;
a >>= 1;
u >>= 1;
}
return r;
}
void init()
{
root[0] = invroot[0] = 1;
root[1] = fpow(generator, (mod - 1) / maxN);
invroot[1] = fpow(root[1], -1);
for (int j = 2; j<maxN; j++){
root[j] = mul(root[j - 1], root[1]);
invroot[j] = mul(invroot[j - 1], invroot[1]);
}
for (int l=0;l<=maxL;l++){
for (int i=0;i<(1<<l);i++) rev[l][i] = get_rev(i,(1<<l));
}
inv[1] = fact[0] = fact[1] = ifact[0] = ifact[1] = 1;
for (int i=2;i<maxN;i++){
inv[i] = (mod - mod / i) * inv[mod % i] % mod;
fact[i] = fact[i-1] * i % mod;
ifact[i] = ifact[i-1] * inv[i] % mod;
}
}
long long comb(int n, int k)
{
if (n < 0 || k < 0 || k > n) return 0;
return fact[n] * ifact[k] % mod * ifact[n-k] % mod;
}
vector<long long> fft(long long *root, int *rev, vector<long long> input)
{
int n = input.size();
vector<long long> res(n);
for (int i = 0; i < n; i++) res[rev[i]] = input[i];
for (int i = 2, h = 1, u = maxN >> 1; i <= n; i <<= 1, h <<= 1, u >>= 1){
for (int k = 0; k < n; k += i){
for (int j = 0; j < h; j++){
long long w = root[u*j];
long long t = mul(w, res[k + j + h]);
long long u = res[k + j];
res[k + j] = add(u, t);
res[k + j + h] = add(u, mod - t);
}
}
}
return res;
}
void poly_norm(vector<long long> &a)
{
while (!a.empty() && a.back() == 0) a.pop_back();
}
vector<long long> poly_mul(vector<long long> a, vector<long long> b)
{
vector<long long> c;
int al = a.size(), bl = b.size(), n = 1, l = 0;
while (n < al + bl - 1) n *= 2, l++;
if (n <= 32){
c = vector<long long>(n,0);
for (int i=0;i<al;i++) for (int j=0;j<bl;j++) c[i+j] = (c[i+j] + a[i] * b[j]) % mod;
}
else{
a.resize(n); b.resize(n);
vector<long long> A = fft(root,rev[l],a);
vector<long long> B = fft(root,rev[l],b);
for (int i=0;i<n;i++) A[i] = mul(A[i],B[i]);
c = fft(invroot,rev[l],A);
long long invn = fpow(n,-1);
for (int i=0;i<n;i++) c[i] = mul(c[i],invn);
}
c.resize(al+bl-1);
return c;
}
vector<int> v[200020];
vector<int> sz;
int dfs(int x, int l)
{
int s = 1;
for (int y : v[x]) if (y != l) s += dfs(y,x);
if (l) sz.push_back(s);
return s;
}
vector<long long> go(vector<int> sz, int div)
{
if (sz.empty()) return vector<long long>();
if (div == -1) return vector<long long>(1,sz.size());
vector<int> a,b;
for (int x : sz){
if (x < (1 << div)) a.push_back(x);
else b.push_back(x-(1<<div));
}
vector<long long> p = go(a,div-1); poly_norm(p);
vector<long long> q = go(b,div-1); poly_norm(q);
if (!q.empty()){
vector<long long> r((1<<div)+1,0);
for (int k=0;k<=(1<<div);k++){
r[k] = comb((1<<div),k);
}
q = poly_mul(q,r);
}
p.resize(max(p.size(),q.size()));
for (int i=0;i<q.size();i++){
p[i] = add(p[i],q[i]);
}
return p;
}
int main()
{
init();
int n; scanf ("%d",&n);
for (int i=1;i<n;i++){
int a,b; scanf ("%d %d",&a,&b);
v[a].push_back(b);
v[b].push_back(a);
}
dfs(1,0);
for (int i=0;i<n-1;i++) sz.push_back(n-sz[i]);
vector<long long> v(n+1,0);
for (int i=0;i<=n;i++) v[i] = comb(n,i) * n % mod;
vector<long long> u = go(sz,17);
u.resize(n+1);
for (int i=1;i<=n;i++) printf ("%lld\n",(v[i]+mod-u[i])%mod);
return 0;
}
./Main.cpp: In function ‘int main()’:
./Main.cpp:169:24: warning: ignoring return value of ‘int scanf(const char*, ...)’, declared with attribute warn_unused_result [-Wunused-result]
int n; scanf ("%d",&n);
^
./Main.cpp:171:33: warning: ignoring return value of ‘int scanf(const char*, ...)’, declared with attribute warn_unused_result [-Wunused-result]
int a,b; scanf ("%d %d",&a,&b);
^