#include #include #include using namespace std; const int MAXN = 100 + 5; const int MOD = 1000000000 + 7; const int MAXM = 20000 + 5; const int MAX_BRUTE_FORCE_M = 20000; const int MAXM2 = 10000; int dp[MAXN][MAXM]; int n, M, K, sumAll[MAXN]; vector adj[MAXN]; void dfs (int k, int par = -1) { for(int adjacentNode : adj[k]) { if (adjacentNode == par) continue; dfs(adjacentNode, k); } sumAll[k] = 0; for(int cc = 1; cc <= M; ++cc) { int ways = 1; for(int adjacentNode : adj[k]) { if (adjacentNode == par) continue; int curWays = sumAll[adjacentNode]; if (K > 0) curWays = (curWays + 100LL * MOD - (dp[adjacentNode][min(M, cc + K - 1)] - dp[adjacentNode][max(1, cc - K + 1) - 1])) % MOD; ways = (ways * 1LL * curWays) % MOD; } dp[k][cc] = (dp[k][cc - 1] + ways) % MOD; sumAll[k] = (sumAll[k] + ways) % MOD; } } void dfs2 (int k, int par = -1) { for(int adjacentNode : adj[k]) { if (adjacentNode == par) continue; dfs2(adjacentNode, k); } sumAll[k] = 0; for(int cc = 1; cc <= MAXM2; ++cc) { int ways = 1; for(int adjacentNode : adj[k]) { if (adjacentNode == par) continue; int curWays = sumAll[adjacentNode]; int L = max(1, cc - K + 1); int R = min(MAXM2 - 1, cc + K - 1); if (K > 0) curWays = (curWays + 100LL * MOD - (dp[adjacentNode][R] - dp[adjacentNode][L - 1])) % MOD; if (R < cc + K - 1 && K > 0) { curWays = (curWays - ((cc + K - 1) - R) * 1LL * (dp[adjacentNode][MAXM2] - dp[adjacentNode][MAXM2 - 1] + MOD) % MOD + MOD) % MOD; } ways = (ways * 1LL * curWays) % MOD; } dp[k][cc] = (dp[k][cc - 1] + ways) % MOD; if (cc < MAXM2) sumAll[k] = (sumAll[k] + ways * 2LL) % MOD; else sumAll[k] = (sumAll[k] + ways * 1LL * (M - (MAXM2 - 1) * 2)) % MOD; } } int main(int argc, const char * argv[]) { // freopen("input.txt", "r", stdin); int testCases; cin >> testCases; while (testCases--) { cin >> n >> M >> K; for(int i = 1; i <= n; i++) adj[i].clear(); for(int i = 1; i < n; ++i) { int x, y; cin >> x >> y; adj[x].push_back(y); adj[y].push_back(x); } if (M <= MAX_BRUTE_FORCE_M) { dfs(1); cout << sumAll[1] << endl; } else { dfs2(1); cout << sumAll[1] << endl; } } return 0; }