#include <bits/stdc++.h>
using namespace std;
#define int long long
const int modulo = 1e9+7;
int32_t main(){
    ios_base::sync_with_stdio(false);
    cin.tie(nullptr);
    int N,D;
    cin >> N >> D;
    vector<vector<int>> adj(N+1);
    for(int i=1;i<N;i++){
        int a,b;cin>>a>>b;
        adj[a].emplace_back(b);
        adj[b].emplace_back(a);
    }
    vector DPbase(N+1,vector<int>(4));
    function<pair<int,int>(int,int)> dfs = [&](int x,int p){
        int children = 0;
        pair<int,int> ans;
        int sumzero = 0;
        int sumone = 1;
        int cntzero = 0;
        for(int&i:adj[x])if(i!=p){
            auto t = dfs(i,x);
            if(t.first){cntzero++;sumzero+=t.second;}
            else sumone+=t.second;
        }
        if(cntzero){
            ans.first = 0;
            if(cntzero==1)ans.second=sumzero;
            else ans.second = 0;
        } else {
            ans.first = 1;
            ans.second=sumone;
        }
        return ans;
    };
    for(int i=1;i<=N;i++){
        auto t = dfs(i,0);
        if(t.first==0){
            DPbase[i][2]=N-t.second;
            DPbase[i][0]=t.second;
        } else {
            DPbase[i][3]=N-t.second;
            DPbase[i][1]=t.second;
        }
    }
    auto binexpo = [&](int x,int p){
        int ans = 1;
        while(p){
            if(p&1){
                ans*=x;
                ans%=modulo;
            }
            p/=2;
            x*=x;
            x%=modulo;
        }
        return ans;
    };
    auto combine = [&](vector<vector<int>> &DP1,vector<vector<int>> &DP2){
        vector DP(N+1,vector<int>(4));
        vector<int> sums(4);
        for(int i=1;i<=N;i++){
            for(int j=0;j<4;j++){
                sums[j]+=DP2[i][j];
            }
        }
        for(int i=0;i<4;i++)sums[i]%=modulo;
        for(int i=1;i<=N;i++){
            DP[i][0]=DP1[i][1]*sums[1]+DP2[i][0]*sums[0];
            DP[i][0]%=modulo;
            DP[i][1]=DP1[i][1]*sums[0]+DP2[i][0]*sums[1];
            DP[i][1]%=modulo;
            DP[i][2]=DP1[i][2]*binexpo(N,2*DP2[0][0])+
                     DP1[i][0]*sums[2]+
                     DP1[i][1]*sums[3];
            DP[i][2]%=modulo;
            DP[i][3]=DP1[i][3]*binexpo(N,2*DP2[0][0])+
                     DP1[i][1]*sums[2]+
                     DP1[i][0]*sums[3];
            DP[i][3]%=modulo;
        }
        DP[0][0]=DP1[0][0]+DP2[0][0];
        return DP;
    };
    function<vector<vector<int>>(int)> solve = [&](int d){
        if(d==1)return DPbase;
        auto half = solve(d/2);
        auto DP = combine(half,half);
        if(d&1)DP=combine(DP,DPbase);
        return DP;
    };
    cout << solve(D+1)[1][2] << '\n';
}
| # | 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... |