Guest User

Untitled

a guest
Jul 28th, 2025
25
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.62 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2.  
  3. int main () {
  4.    
  5.     int n, maxK;
  6.     std::cin >> n >> maxK;
  7.    
  8.     std::vector<std::vector<int>> edges(n);
  9.     for (int i = 0; i < n - 1; ++i) {
  10.         int u, v;
  11.         std::cin >> u >> v;
  12.         --u, --v;
  13.         edges[u].push_back(v);
  14.         edges[v].push_back(u);
  15.     }
  16.    
  17.     std::vector<std::vector<int64_t>> dp(n, std::vector<int64_t>(maxK + 1, 0));
  18.    
  19.     auto dfs = [&](int cur, int dad, auto&& dfs) -> void {
  20.        
  21.         for (const auto nei : edges[cur])
  22.             if (nei != dad)
  23.                 dfs(nei, cur, dfs);
  24.                
  25.         auto& dp1 = dp[cur];
  26.         std::vector<int64_t> dp2(maxK + 1, 0);
  27.         dp1[0] = 1;
  28.        
  29.         for (const auto nei : edges[cur]) {
  30.             if (nei == dad)
  31.                 continue;
  32.            
  33.             std::fill(dp2.begin(), dp2.end(), 0);
  34.  
  35.             for (int k1 = maxK; k1 >= 0; --k1) {
  36.                 if (!dp1[k1])
  37.                     continue;
  38.                
  39.                 //we skip this nei -> so we get +1 blue
  40.                 if (k1 != maxK)
  41.                     dp2[k1 + 1] += dp1[k1];
  42.                    
  43.                 for (int k2 = 0; k1 + k2 <= maxK; ++k2)
  44.                     dp2[k1 + k2] += dp1[k1] * dp[nei][k2];
  45.             }
  46.            
  47.             std::swap(dp1, dp2);
  48.         }
  49.     };
  50.    
  51.     dfs(0, -1, dfs);
  52.  
  53.     int64_t ans = 1;
  54.  
  55.     for (int cur = 0; cur < n; ++cur) {
  56.         ans += std::accumulate(dp[cur].begin(), dp[cur].end(), 0LL);
  57.         if (cur)
  58.             ans -= dp[cur][maxK];
  59.     }
  60.  
  61.     std::cout << ans << "\n";
  62.    
  63.     return 0;
  64. }
Advertisement
Add Comment
Please, Sign In to add comment