func_code_string: #include <bits/stdc++.h>   using namespace std;   void file_put() {     freopen( filename.in ,  r , stdin);     freopen( filename.out ,  w , stdout);   }   long long Pow(long long x, long long k, long long _p) {     long long ans = 1;     for (; k; k >>= 1, x = x * x % _p)       if (k & 1) (ans *= x) %= _p;     return ans;   }   const int N = 100005, _p = 998244353;   const int _M = N, _N = N;   template <class V>   struct FT {     vector<V> aa, bb;     V w[2][_M * 2 + 5], rev[_M * 2 + 5], tmp;     void FFT(vector<V> &A, int m, int op) {       int N = 1 << m;       V w0 = Pow(3, (_p - 1) / N, _p);       w[0][0] = w[1][0] = 1;       for (int i = (1); i < (N); i++)         w[0][i] = w[1][N - i] = (long long)w[0][i - 1] * w0 % _p;       for (int i = (1); i < (N); i++)         rev[i] = (rev[i >> 1] >> 1) | (i & 1) << m - 1;       for (int i = (0); i < (N); i++)         if (i < rev[i]) swap(A[i], A[rev[i]]);       for (int i = 1; i < N; i <<= 1)         for (int j = 0, t = N / (i << 1); j < N; j += i << 1)           for (int k = j, l = 0; k < j + i; k++, l += t) {             V x = A[k], y = (long long)w[op][l] * A[k + i] % _p;             A[k] = (x + y) % _p, A[k + i] = (x - y + _p) % _p;           }       if (op) {         tmp = Pow(N, _p - 2, _p);         for (int i = (0); i < (N); i++) A[i] = 1ll * A[i] * tmp % _p;       }     }     vector<V> multiply(vector<V> A, vector<V> B, vector<V> *C = NULL,                        int op = 0) {       int lena = A.size(), lenb = B.size(), len = 1, L = 0;       aa = A, bb = B;       while (len < lena + lenb - 1) len <<= 1, ++L;       aa.resize(len), bb.resize(len);       if (op) reverse((bb).begin(), (bb).end());       FFT(aa, L, 0), FFT(bb, L, 0);       if (!C) C = &A;       (*C).resize(len);       for (int i = (0); i < (len); i++) (*C)[i] = (long long)aa[i] * bb[i] % _p;       FFT(*C, L, 1);       if (op) reverse((*C).begin(), (*C).end());       (*C).resize(lena + lenb - 1);       return *C;     }   };   int n, k, x, y, siz[N];   vector<int> V[N], P[N];   long long ans = 0, s = 0, fac[N], inv[N], dp[N];   FT<int> T;   vector<int> solve(int l, int r, const vector<int> &a) {     if (l == r) return vector<int>{1, a[l]};     int mid = l + r >> 1;     return T.multiply(solve(l, mid, a), solve(mid + 1, r, a));   }   void dfs(int x, int p) {     siz[x] = 1;     for (auto y : V[x]) {       if (y == p) continue;       dfs(y, x), siz[x] += siz[y], P[x].push_back(siz[y]);     }     if (P[x].empty())       P[x].push_back(1);     else       P[x] = solve(0, (int)P[x].size() - 1, P[x]);     for (int i = (0); i < (min(k, (int)P[x].size() - 1) + 1); i++)       dp[x] += inv[k - i] % _p * P[x][i] % _p;     dp[x] %= _p, (dp[x] *= fac[k]) %= _p;   }   void dfs(int x, int p, long long s1, long long s2) {     ans += dp[x] * (s1 - s2) % _p, ans %= _p;     P[x].push_back(0);     unordered_map<int, int> M;     for (int i = ((int)P[x].size()) - 1; i >= (1); i--)       P[x][i] += (long long)P[x][i - 1] * (n - siz[x]) % _p, P[x][i] %= _p;     for (auto y : V[x]) {       if (y == p || M.find(siz[y]) != M.end()) continue;       long long ret = 0;       vector<int> tmp = P[x];       for (int i = (0); i < ((int)tmp.size() - 1); i++)         tmp[i + 1] -= (long long)tmp[i] * siz[y] % _p, tmp[i + 1] %= _p;       for (int i = (0); i < (min(k, (int)tmp.size() - 1) + 1); i++)         ret += tmp[i] * fac[k] % _p * inv[k - i] % _p, ret %= _p;       M[siz[y]] = ret;     }     for (auto y : V[x]) {       if (y == p) continue;       dfs(y, x, (s1 + M[siz[y]]) % _p, (s2 + dp[x]) % _p);     }   }   int main() {     std::ios::sync_with_stdio(false);     std::cin.tie(0);     scanf( %d%d , &n, &k);     for (int i = (1); i < (n); i++)       scanf( %d%d , &x, &y), V[x].push_back(y), V[y].push_back(x);     fac[0] = inv[0] = inv[1] = 1;     for (int i = (2); i < (N); i++) inv[i] = (_p - _p / i) * inv[_p % i] % _p;     for (int i = (1); i < (N); i++)       inv[i] = inv[i - 1] * inv[i] % _p, fac[i] = fac[i - 1] * i % _p;     if (k == 1) {       cout << (long long)n * (n - 1) / 2 % _p << endl;       return 0;     }     dfs(1, 0), dfs(1, 0, 0, 0);     for (int i = (1); i < (n + 1); i++)       ans += dp[i] * s % _p, s += dp[i], ans %= _p, s %= _p;     cout << (ans + _p) % _p << endl;     return 0;   }   