#include #include #include #include #include #include #include #include #include #include #include #define repd(i,a,b) for (int i=(a);i<(b);i++) #define rep(i,n) repd(i,0,n) #define var auto #define mod 1000000007 typedef long long ll; using namespace std; int inputValue(){ int a; cin >> a; return a; }; template void output(T a, int precision) { if(precision > 0){ cout << setprecision(precision) << a << "\n"; } else{ cout << a << "\n"; } } vector> ngb(2000); // neighbor vector dnc(int n, int p){ // 親がpの頂点nを根にしたsubtreeで0~n個塗る場合の数を返す vector ret(1, 1); // 初期値: 0個塗る場合の数は1通り rep(i, ngb[n].size()){ if (ngb[n][i] == p) { // 今いる頂点の親と子(実は親)が一緒の場合は何もしない continue; } // 分割統治 vector add = dnc(ngb[n][i], n); vector new_ret(ret.size() + add.size() - 1, 0); rep(j, ret.size()){ rep(k, add.size()){ new_ret[j + k] = (new_ret[j + k] + ret[j] * add[k]) % mod; } } ret = new_ret; } ret.push_back(1); // 頂点nを塗る場合は全て塗るので1通り return ret; } int main() { cin.tie(0); ios_base::sync_with_stdio(0); // source code int N = inputValue(); int K = inputValue(); rep(i, N - 1){ int a = inputValue(); int b = inputValue(); ngb[a].push_back(b); ngb[b].push_back(a); } output(dnc(0, -1)[K], 0); return 0; }