#include <bits/stdc++.h>
#include <ext/pb_ds/assoc_container.hpp>
using namespace __gnu_pbds;
using namespace std;
// trans rights
#define int long long
#define f first
#define s second
#define endl '\n'
#define all(x) begin(x), end(x)
#define MOD 1000000007
 
int expn(int x, int y) {
    if (y == 0) return 1;
    int t = expn(x, y / 2);
    t = (t * t) % MOD;
    if (y % 2) t = (t * x) % MOD;
    return t;
}
 
int n, d, lval, eval;
vector<int> grph[100007];
 
int isl[100007];
gp_hash_table<int, int> cdfs[100007], cdfs2[100007];
pair<int, int> lst[100007];
int dfs(int x, int par = -1) {
    if (cdfs[x].find(par) != cdfs[x].end()) {
        return cdfs[x][par];
    }
    int cnt = 0;
    if (lst[x] == make_pair(-1ll, -1ll)) {
        for (int i : grph[x]) if (i != par) cnt += dfs(i, x);
    }
    else {
        cnt = lst[x].s;
        if (~lst[x].f) cnt += dfs(lst[x].f, x);
        if (~par) cnt -= dfs(par, x);
    }
    lst[x] = {par, cnt};
    return cdfs[x][par] = (cnt == 0);
}
int dfs2(int x, int par = -1) {
    if (cdfs2[x].find(par) != cdfs2[x].end()) {
        return cdfs2[x][par];
    }
    int cnt = 0;
    if (lst[x] == make_pair(-1ll, -1ll)) {
        if (cdfs[x][par]) {
            cnt = 1;
            for (int i : grph[x]) if (i != par) {
                if (!cdfs[i][x]) cnt += dfs2(i, x);
            }
        }
        else {
            for (int i : grph[x]) if (i != par) {
                if (cdfs[i][x]) cnt += 1000000 + dfs2(i, x);
            }
        }
    }
    else {
        cnt = lst[x].s;
        if (cdfs[x][par]) {
            if (~lst[x].f) if (!cdfs[lst[x].f][x]) cnt += dfs2(lst[x].f, x);
            if (~par) if (!cdfs[par][x]) cnt -= dfs2(par, x);
        }
        else {
            if (~lst[x].f) if (cdfs[lst[x].f][x]) cnt += 1000000 + dfs2(lst[x].f, x);
            if (~par) if (cdfs[par][x]) cnt -= 1000000 + dfs2(par, x);
        }
    }
    if (cdfs[x][par]) {
        return cdfs2[x][par] = cnt;
    }
    if (cnt / 1000000 == 1) return cdfs2[x][par] = cnt - 1000000;
    return cdfs2[x][par] = 0;
}
signed main() {
    ios_base::sync_with_stdio(0);
    cin.tie(NULL);
    cin>>n>>d;
    for (int i = 0; i < n - 1; i++) {
        int a, b; cin>>a>>b; a--;b--;
        grph[a].push_back(b);
        grph[b].push_back(a);
    }
    for (int i = 0; i < n; i++) lst[i] = {-1, -1};
    for (int i = 0; i < n; i++) {
        lval += (isl[i] = dfs(i));
    }
    for (int i = 0; i < n; i++) lst[i] = {-1, -1};
    for (int i = 0; i < n; i++) {
        if (isl[i]) eval -= dfs2(i);
        else eval += dfs2(i);
    }
    int t1 = (expn(n, 2 * d) - expn(eval, d) + MOD) % MOD;
    int t2 = expn((expn(n, 2) - eval + MOD) % MOD, MOD - 2);
    int t3 = (t1 * t2) % MOD;
    t3 = (lval * t3) % MOD;
    int ans = (cdfs2[0][-1] * t3) % MOD;
    if (!isl[0]) ans = (expn(n, 2 * d) - ans + MOD) % MOD;
    cout<<ans<<endl;
    return 0;
}
| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... |