Solution
Code
#pragma GCC optimize(3)
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef long long LL;
const int N = 1e6 + 5;
const ll mod = 1e9 + 7;
const int DEG = 20;
const double PI = acos(-1.0);
const double eps = 1e-10;
const ll inf = 1e18;
static auto faster_iostream = []() {
std::ios::sync_with_stdio(false); // turn off sync
std::cin.tie(nullptr); // untie in/out streams
return 0;
}();
ll dp[305][305]; // dp[i][j] i 个点用了 j 个色
vector<int> G[305];
int main(){
int n, k;
cin >> n >> k;
for(int i = 1; i <= n - 1; i++){
int u, v;
cin >> u >> v;
G[u].push_back(v);
G[v].push_back(u);
}
ll ans = 0;
for(int i = 1; i <= n; i++){
dp[i][1] = k; // i 个点用 1 个色 有 k 种情况
}
for(int i = 1; i <= n; i++){
for(int j = 2; j <= k; j++){
dp[i][j] = (dp[i - 1][j] + (dp[i - 1][j - 1]) * (k - j + 1)) % mod; // 要么颜色相同, 要么从剩下的k - (j - 1) 种颜色里选一种新的
}
}
for(int i = 1; i <= k; i++){
ans += dp[n][i];
ans %= mod;
}
cout << ans << "\n";
return 0;
} 
京公网安备 11010502036488号