HDU4625 JZPTREE

include<bits/stdc++.h>

using namespace std;
namespace yspm{
inline int read()
{
int res=0,f=1; char k;
while(!isdigit(k=getchar())) if(k'-') f=-1;
while(isdigit(k)) res=res10+k-'0',k=getchar();
return res
f;
}
const int N=50010,mod=10007;
struct node{
int to,nxt;
}e[N<<1];
int head[N],cnt,n,k;
inline void adde(int u,int v)
{
e[++cnt].to=v; e[cnt].nxt=head[u];
return head[u]=cnt,void();
}
inline int add(int x,int y){return x+y>=mod?x+y-mod:x+y;}
inline int del(int x,int y){return x-y>=0?x-y:x-y+mod;}
int f[N][510],s[510][510],fac[510];
inline void dfs1(int x,int fat)
{
for(int i=head[x];i;i=e[i].nxt)
{
int t=e[i].to; if(t
fat) continue; dfs1(t,x);
f[x][0]=add(f[x][0],f[t][0]);
for(int j=1;j<=k;++j) f[x][j]=add(f[x][j],add(f[t][j],f[t][j-1]));
} ++f[x][0];
return ;
}
inline void dfs2(int x,int fa)
{
for(int i=head[x];i;i=e[i].nxt)
{
int t=e[i].to; if(t==fa) continue;
for(int j=k;j>=1;--j)
{
int r1=del(f[x][j],add(f[t][j],f[t][j-1]));
int r2=del(f[x][j-1],add(f[t][j-1],j>=2?f[t][j-2]:0));
f[t][j]=add(f[t][j],add(r1,r2));
}
f[t][0]=add(f[t][0],del(f[x][0],f[t][0]));
dfs2(t,x);
} return ;
}
inline void work()
{
memset(e,0,sizeof(e)); memset(f,0,sizeof(f)); memset(head,0,sizeof(head)); cnt=0;
n=read(); k=read();
for(int i=1,u,v;i<n;++i) u=read(),v=read(),adde(u,v),adde(v,u);
dfs1(1,0); dfs2(1,0);
for(int i=1;i<=n;++i)
{
int ans=0;
for(int j=0;j<=k;++j) ans=add(ans,f[i][j]fac[j]%mods[k][j]%mod);
cout<<ans<<endl;
} return ;
}
signed main()
{
s[1][1]=fac[0]=fac[1]=1; for(int i=1;i<=500;++i) s[i][1]=1,fac[i]=fac[i-1]i%mod;
for(int i=2;i<=500;++i)
{
for(int j=2;j<=i;++j) s[i][j]=add(s[i-1][j-1],s[i-1][j]
j%mod);
}
int T=read(); while(T--) work();
return 0;
}
}
signed main(){return yspm::main();}

猜你喜欢

转载自www.cnblogs.com/yspm/p/13387603.html
hdu