#include<bits/stdc++.h>
#define pb push_back
using namespace std;
const int N = 5e4 + 10;
const int mod = 10007;
int mul(int x, int y) { return 1ll * x * y % mod; }
int add(int x, int y) { return x + y >= mod ? x + y - mod : x + y; }
int sub(int x, int y) { return x - y < 0 ? x - y + mod : x - y; }
int qpow(int a, int b) {
int res = 1;
for( ; b; b >>= 1, a = mul(a, a)) if(b & 1) res = mul(res, a);
return res;
}
int n, k, str[N], fac[N], ifac[N], dp[N][155], dp1[N][155], siz[N];
int C(int n, int m) { return mul(fac[n], mul(ifac[n - m], ifac[m])); }
vector<int> G[N];
void dfs(int u, int pre) {
dp[u][0] = 1;
for(int v : G[u]) if(v ^ pre) dfs(v, u);
for(int v : G[u]) {
if(v == pre) continue;
for(int j = 0; j <= k; j++)
dp[u][j] = add(dp[u][j], add(dp[v][j], j < 1 ? 0 : dp[v][j - 1]));
}
}
int tmp[N];
void dfs1(int u, int pre) {
memcpy(dp1[u], dp[u], sizeof dp[u]);
if(pre) {
for(int j = 0; j <= k; j++)
tmp[j] = sub(dp1[pre][j], add(dp[u][j], j < 1 ? 0 : dp[u][j - 1]));
for(int j = 0; j <= k; j++)
dp1[u][j] = add(dp1[u][j], add(tmp[j], j < 1 ? 0 : tmp[j - 1]));
}
for(int v : G[u]) if(v ^ pre) dfs1(v, u);
}
int main() {
scanf("%d%d", &n, &k);
for(int i = 1, u, v; i < n; i++) {
scanf("%d%d", &u, &v);
G[u].pb(v); G[v].pb(u);
}
////////////////
fac[0] = 1; for(int i = 1; i <= k; i++) fac[i] = mul(fac[i - 1], i);
ifac[k] = qpow(fac[k], mod - 2); for(int i = k - 1; i >= 0; i--) ifac[i] = mul(ifac[i + 1], i + 1);
////////////////
for(int i = 1; i <= k; i++)
for(int j = 0; j <= i; j++)
str[i] = add(str[i], mul(mul((i - j) & 1 ? mod - 1 : 1, qpow(j, k)), mul(ifac[j], ifac[i - j])));
dfs(1, 0);
dfs1(1, 0);
for(int j = 1; j <= n; j++) {
int ans = 0;
for(int i = 1; i <= k; i++)
ans = add(ans, mul(mul(str[i], fac[i]), dp1[j][i]));
printf("%d\n", ans);
}
return 0;
}
上面这段代码 //// 框起来的部分把 k 改成 n, 就是20分。