玄关求条
查看原帖
玄关求条
1007305
Terry_RE楼主2025/8/29 19:58

样例没过,,
但我感觉我写的挺对的啊

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;

const int mod = 1e9+7;
const int N = 2e5+7;

int n, k;

vector<int> G[N];

ll qpow(ll a, ll b){
	ll res(1);

	while(b){
		if(b & 1)
			res = res * a % mod;

		a = a * a % mod;
		b >>= 1;
	}

	return res;
}

ll fact[N];
ll inv_fact[N];

void init(){
	fact[0] = inv_fact[0] = 1;

	for(int i(1); i <= 2e5; ++i){
		fact[i] = fact[i-1] * i % mod;
		inv_fact[i] = inv_fact[i-1] * qpow(i, mod-2) % mod;
	}
}

ll C(int a, int b){
	return fact[a] * inv_fact[b] % mod * inv_fact[a - b] % mod;
}

int siz[N];
ll f[N];
ll sum[N];
ll g[N];

ll ans;

void dfs(int u, int pre){
	siz[u] = 1;

	for(int v : G[u])
		if(v != pre)
			dfs(v, u), siz[u] += siz[v], sum[u] = (sum[u] + sum[v]) % mod;
		
	if(siz[u] >= k)
		f[u] = siz[u] % mod * C(siz[u], k) % mod;
	sum[u] = (sum[u] + f[u]) % mod;

	return ;
}

void dfs1(int u, int pre){
	ans = (ans + g[u]) % mod;

	for(int v : G[u])
		if(v != pre){
			g[v] = ((g[u] - f[v]) % mod + mod) % mod;

			dfs1(v, u);
		}
}

void Sol(){
	cin >> n >> k;

	init();

	for(int i(1), u, v; i < n; ++i){
		cin >> u >> v;

		G[u].emplace_back(v);
		G[v].emplace_back(u);
	}
	
	dfs(1, 0);
	g[1] = sum[1];
	dfs1(1, 0);

	cout << ans << ' ';
}

signed main(){
	cin.tie(0) -> ios::sync_with_stdio(false);

	int T = 1;
	//cin >> T;

	while(T--)
		Sol();

	return 0;
}
2025/8/29 19:58
加载中...