Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <bits/stdc++.h>
- using namespace std;
- using ll = long long;
- using ld = long double;
- using ull = unsigned long long;
- const bool typetest = 0;
- const int N = 3e3 + 5;
- const ll mod = 1e9 + 7;
- int n;
- vector<int> adj[N];
- int a[N], b[N], cnt[N];
- ll dp[N][N], ans[N][N], gt[N], rgt[N];
- void Read()
- {
- cin >> n;
- for (int i = 1; i < n; ++i)
- {
- cin >> a[i] >> b[i];
- adj[a[i]].push_back(i);
- adj[b[i]].push_back(i);
- }
- }
- ll Pow(ll a, ll b)
- {
- ll ans(1);
- for (; b > 0; b >>= 1)
- {
- if (b & 1)
- ans = ans * a % mod;
- a = a * a % mod;
- }
- return ans;
- }
- ll C(int k, int n)
- {
- if (k > n)
- return 0;
- return gt[n] * rgt[k] % mod * rgt[n - k] % mod;
- }
- void dfs(int v, int p)
- {
- dp[v][1] = 1;
- cnt[v] = 1;
- for (auto j : adj[v])
- {
- int i = a[j] ^ b[j] ^ v;
- if (i != p)
- {
- dfs(i, v);
- cnt[v] += cnt[i];
- for (int y = cnt[v]; y; --y)
- {
- dp[v][y] = dp[v][y] * C(cnt[i], cnt[v] - y) % mod * (v == a[j] ? ans[i][cnt[i]] : 0) % mod;
- for (int x = max(1, cnt[i] - (cnt[v] - y)); x < y && x <= cnt[i]; ++x)
- (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;
- }
- }
- }
- for (int i = 1; i <= cnt[v]; ++i)
- ans[v][i] = (ans[v][i - 1] + dp[v][i]) % mod;
- //cout << v << ": " << cnt[v] << " " << ans[v][cnt[v]] << "\n";
- }
- void Solve()
- {
- gt[0] = rgt[0] = 1;
- for (int i = 1; i <= n; ++i)
- {
- gt[i] = gt[i - 1] * i % mod;
- rgt[i] = Pow(gt[i], mod - 2);
- }
- dfs(1, 1);
- cout << (ans[1][n] + mod) % mod;
- }
- int32_t main()
- {
- ios::sync_with_stdio(0);
- cin.tie(0);
- cout.tie(0);
- int t(1);
- if (typetest)
- cin >> t;
- for (int _ = 1; _ <= t; ++_)
- {
- Read();
- Solve();
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement