Advertisement
Dang_Quan_10_Tin

topocnt

Feb 2nd, 2021
240
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.02 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2. using namespace std;
  3. using ll = long long;
  4. using ld = long double;
  5. using ull = unsigned long long;
  6.  
  7. const bool typetest = 0;
  8. const int N = 3e3 + 5;
  9. const ll mod = 1e9 + 7;
  10. int n;
  11. vector<int> adj[N];
  12. int a[N], b[N], cnt[N];
  13. ll dp[N][N], ans[N][N], gt[N], rgt[N];
  14.  
  15. void Read()
  16. {
  17.     cin >> n;
  18.     for (int i = 1; i < n; ++i)
  19.     {
  20.         cin >> a[i] >> b[i];
  21.         adj[a[i]].push_back(i);
  22.         adj[b[i]].push_back(i);
  23.     }
  24. }
  25.  
  26. ll Pow(ll a, ll b)
  27. {
  28.     ll ans(1);
  29.     for (; b > 0; b >>= 1)
  30.     {
  31.         if (b & 1)
  32.             ans = ans * a % mod;
  33.         a = a * a % mod;
  34.     }
  35.     return ans;
  36. }
  37.  
  38. ll C(int k, int n)
  39. {
  40.     if (k > n)
  41.         return 0;
  42.     return gt[n] * rgt[k] % mod * rgt[n - k] % mod;
  43. }
  44.  
  45. void dfs(int v, int p)
  46. {
  47.     dp[v][1] = 1;
  48.     cnt[v] = 1;
  49.     for (auto j : adj[v])
  50.     {
  51.         int i = a[j] ^ b[j] ^ v;
  52.         if (i != p)
  53.         {
  54.             dfs(i, v);
  55.             cnt[v] += cnt[i];
  56.             for (int y = cnt[v]; y; --y)
  57.             {
  58.                 dp[v][y] = dp[v][y] * C(cnt[i], cnt[v] - y) % mod * (v == a[j] ? ans[i][cnt[i]] : 0) % mod;
  59.                 for (int x = max(1, cnt[i] - (cnt[v] - y)); x < y && x <= cnt[i]; ++x)
  60.                     (dp[v][y] += dp[v][y - x] * C(x, y - 1) % mod * C(cnt[i] - x, cnt[v] - y) % mod * (v == a[j] ? (ans[i][cnt[i]] - ans[i][x]) : ans[i][x]) % mod) %= mod;
  61.             }
  62.         }
  63.     }
  64.     for (int i = 1; i <= cnt[v]; ++i)
  65.         ans[v][i] = (ans[v][i - 1] + dp[v][i]) % mod;
  66.     //cout << v << ": " << cnt[v] << " " << ans[v][cnt[v]] << "\n";
  67. }
  68.  
  69. void Solve()
  70. {
  71.     gt[0] = rgt[0] = 1;
  72.     for (int i = 1; i <= n; ++i)
  73.     {
  74.         gt[i] = gt[i - 1] * i % mod;
  75.         rgt[i] = Pow(gt[i], mod - 2);
  76.     }
  77.     dfs(1, 1);
  78.     cout << (ans[1][n] + mod) % mod;
  79. }
  80.  
  81. int32_t main()
  82. {
  83.     ios::sync_with_stdio(0);
  84.     cin.tie(0);
  85.     cout.tie(0);
  86.     int t(1);
  87.     if (typetest)
  88.         cin >> t;
  89.     for (int _ = 1; _ <= t; ++_)
  90.     {
  91.         Read();
  92.         Solve();
  93.     }
  94. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement