Equidistant Vertices-树型dp-Codeforces Round #734 (Div. 3)

简介: DescriptionA tree is an undirected connected graph without cycles.You are given a tree of n vertices. Find the number of ways to choose exactly k vertices in this tree (i. e. a k-element subset of vertices) so that all pairwise distances between the selected vertices are equal (in other words,

Description


A tree is an undirected connected graph without cycles.


You are given a tree of n vertices. Find the number of ways to choose exactly k vertices in this tree (i. e. a k-element subset of vertices) so that all pairwise distances between the selected vertices are equal (in other words, there exists an integer c such that for all u,v (u≠v, u,v are in selected vertices) du,v=c, where du,v is the distance from u to v).


Since the answer may be very large, you need to output it modulo 109+7.


Input


The first line contains one integer t (1≤t≤10) — the number of test cases. Then t test cases follow.


Each test case is preceded by an empty line.


Each test case consists of several lines. The first line of the test case contains two integers n and k (2≤k≤n≤100) — the number of vertices in the tree and the number of vertices to be selected, respectively. Then n−1 lines follow, each of them contains two integers u and v (1≤u,v≤n, u≠v) which describe a pair of vertices connected by an edge. It is guaranteed that the given graph is a tree and has no loops or multiple edges.


Output


For each test case output in a separate line a single integer — the number of ways to select exactly k vertices so that for all pairs of selected vertices the distances between the vertices in the pairs are equal, modulo 109+7 (in other words, print the remainder when divided by 1000000007).


Example


input


3
4 2
1 2
2 3
2 4
3 3
1 2
2 3
5 3
1 2
2 3
2 4
4 5


output


6
0
1
typedef int itn;
struct node{
  int v,nex;
}e[107 << 1];
int head[107 << 1],cnt;
int n,k;
void init(){
  cnt = 0;
  for(int i=0;i<(107<<1);i++) head[i] = -1;
}
void add(int u,int v){
  e[cnt].v = v;
  e[cnt].nex = head[u];
  head[u] = cnt ++;
}
int siz[107];
bool vis[107];
int dp[107][107];
void dfs(int u,int fa,int dep,int pnt){
  vis[u] = 1;
  if(dep == pnt){
    siz[u] ++;
    return;
  }
  for(int i=head[u];~i;i=e[i].nex){
    int to = e[i].v;
    if(to == fa) continue;
    dfs(to,u,dep+1,pnt);
    siz[u] += siz[to];
  }
}
int main()
{
  int _ = read;
  while(_ --){
    n = read,k = read;
    init();
    for(int i=1;i<n;i++){
      int u = read,v = read;
      add(u,v);
      add(v,u);
    }
    ll ans = 0;
    if(k == 2){
      ans = n * (n - 1) / 2 % mod;
      printf("%lld\n",ans);
      continue;
    }
    for(int i=1;i<=n;i++){
      for(int j=1;j<=n;j++){
        memset(vis,0,sizeof vis);
        memset(siz,0,sizeof siz);
        memset(dp,0,sizeof dp);
        dfs(i,0,0,j);
        dp[0][0] = 1;
        int it = 0;
        for(int tj = head[i];~tj;tj=e[tj].nex){
          int to = e[tj].v;
          if(siz[to] == 0) continue;
          for(int kk=0;kk<=it;kk++){
            dp[it+1][kk] += dp[it][kk];
            dp[it+1][kk] %= mod;
            dp[it+1][kk+1] += dp[it][kk] * siz[to] % mod;
            dp[it+1][kk+1] %= mod;
          }
          it ++;
        }
        ans += dp[it][k];
        ans %= mod;
      }
    }
    printf("%lld\n",ans);
  }
    return 0;
}




目录
相关文章
|
2月前
|
机器学习/深度学习 人工智能 测试技术
Codeforces Round 960 (Div. 2)
Codeforces Round 960 (Div. 2)
|
5月前
Codeforces Round #567 (Div. 2)
【7月更文挑战第1天】
49 7
Codeforces Round #192 (Div. 2) (330A) A. Cakeminator
如果某一行没有草莓,就可以吃掉这一行,某一列没有也可以吃点这一列,求最多会被吃掉多少块蛋糕。
50 0
Codeforces Round #675 (Div. 2) A~D
Codeforces Round #675 (Div. 2) A~D
158 0
|
机器学习/深度学习
|
人工智能
Codeforces Round #723 (Div. 2)B. I Hate 1111
Description You are given an integer x. Can you make x by summing up some number of 11,111,1111,11111,…? (You can use any number among them any number of times). For instance, 33=11+11+11 144=111+11+11+11
184 0
Codeforces Round #723 (Div. 2)B. I Hate 1111