题面
首先一个联通块也是一棵树,点数
=
=
边数,考虑每条边的贡献,最后加上
(NK)
(
N
K
)
即可。
记
sizei
s
i
z
e
i
为
i
i
的子树大小,那么到其父亲的边的贡献就是
(NK)−(sizeiK)−(N−sizeiK)
(
N
K
)
−
(
s
i
z
e
i
K
)
−
(
N
−
s
i
z
e
i
K
)
。把第一项拿出来,记
ai
a
i
为每个子树大小
i
i
的出现次数,于是我们只需要计算:
设 Ai=ai∗i!,Bi=1i! A i = a i ∗ i ! , B i = 1 i ! ,就只需要计算:
NTT即可。
(还有 924844033 924844033 的原根是 5 5 <script type="math/tex" id="MathJax-Element-14">5</script>
代码:
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#define ll long long
using namespace std;
const int mod=924844033;
const int g=5;
int n,bit,sz[200010];
ll a[524300],b[524300],r[524300],fac[200010],ifac[200010];
int read()
{
int x=0;char ch=getchar();
for(;ch<'0'||ch>'9';ch=getchar());
for(;ch>='0'&&ch<='9';ch=getchar()) x=x*10+ch-'0';
return x;
}
ll ksm(ll a,int b){ll r=1;for((b+=(mod-1))%=(mod-1);b;b>>=1){if(b&1)r=r*a%mod; a=a*a%mod;}return r;}
struct edge
{
int t;
edge *next;
}*con[200010];
void ins(int x,int y)
{
edge *p=new edge;
p->t=y;
p->next=con[x];
con[x]=p;
}
void init()
{
while((1<<bit)<=(n<<1)) bit++;
for(int i=0;i<(1<<bit);i++)
r[i]=(r[i>>1]>>1)|((i&1)<<(bit-1));
}
void fft(ll *a,int n,int dft)
{
for(int i=0;i<n;i++)
if(i<r[i]) swap(a[i],a[r[i]]);
for(int i=1;i<n;i<<=1)
{
ll wn=ksm(g,(mod-1)*dft/(i<<1));
for(int j=0;j<n;j+=(i<<1))
{
ll wk=1;
for(int k=j;k<j+i;k++)
{
ll x=a[k],y=a[k+i]*wk%mod;
a[k]=(x+y)%mod;a[k+i]=(x-y+mod)%mod;
wk=wk*wn%mod;
}
}
}
if(dft==-1)for(int i=0;i<n;i++) a[i]=a[i]*ksm(n,mod-2)%mod;
}
void dfs(int v,int fa)
{
sz[v]=1;
for(edge *p=con[v];p;p=p->next)
if(p->t!=fa) dfs(p->t,v),sz[v]+=sz[p->t];
if(fa)a[sz[v]]++,a[n-sz[v]]++;
}
int main()
{
n=read();
fac[0]=1;
for(int i=1;i<=n;i++)
fac[i]=fac[i-1]*i%mod;
ifac[n]=ksm(fac[n],mod-2);
for(int i=n-1;i>=0;i--)
ifac[i]=ifac[i+1]*(i+1)%mod;
for(int i=1;i<n;i++)
{
int x=read(),y=read();
ins(x,y);
ins(y,x);
}
dfs(1,0);
for(int i=0;i<=n;i++)
a[i]=a[i]*fac[i]%mod;
for(int i=0;i<=n;i++)
b[i]=ifac[n-i];
init();
fft(a,(1<<bit),1);
fft(b,(1<<bit),1);
for(int i=0;i<(1<<bit);i++)
a[i]=a[i]*b[i]%mod;
fft(a,(1<<bit),-1);
for(int k=1;k<=n;k++)
{
printf("%lld\n",(fac[n]*ifac[n-k]%mod*n-a[n+k]+mod)%mod*ifac[k]%mod);
}
return 0;
}