#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 dnc(vector> ngb, 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, 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() { // source code int N = inputValue(); int K = inputValue(); vector> ngb(N); // neighbor rep(i, N - 1){ int a = inputValue(); int b = inputValue(); ngb[a].push_back(b); ngb[b].push_back(a); } var ans = dnc(ngb, 0, -1); output(dnc(ngb, 0, -1)[K], 0); return 0; }