rt。
#include <iostream>
#define maxN 1100100
using namespace std;
const int mod = 1e9 + 7;
int head[maxN], nxt[maxN << 1], to[maxN << 1], cnt;
void addEdge(int x, int y) {
nxt[++ cnt] = head[x];
head[x] = cnt;
to[cnt] = y;
}
int n, m;
int dp[maxN][2];
void dfs(int u, int father) {
for (int i = head[u]; i; i = nxt[i]) {
int v = to[i];
if (v == father) continue;
dfs(v, u);
dp[u][0] = 1ll * dp[u][0] * (dp[v][0] + 1ll * m * dp[v][1] % mod) %mod;
dp[u][1] = 1ll * dp[u][1] * (dp[v][0] + 1ll * (m - 1) * dp[v][1] % mod) %mod;
}
}
int main() {
cin >> n >> m;
for (int i = 1, u, v; i < n; ++ i) {
cin >> u >> v;
addEdge(u, v), addEdge(v, u);
}
for (int i = 1; i <= n; ++ i) {
dp[i][0] = dp[i][1] = 1;
}
dfs(1, 0);
cout << (dp[1][0] + 1ll * m * dp[1][1] % mod) % mod << endl;
return 0;
}
蒟蒻马蜂总被同学嘲讽求改进。