萌新不懂
查看原帖
萌新不懂
360780
Qerrj楼主2024/7/23 10:56
#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;
}

上面这段代码 //// 框起来的部分把 kk 改成 nn, 就是20分。

2024/7/23 10:56
加载中...