Untitled
unknown
plain_text
a year ago
1.3 kB
7
Indexable
#include <bits/stdc++.h> using ll = long long; using namespace std; const int MOD = 1e9 + 7; struct SL { vector<ll> ele, dp; friend void swap(SL &s, SL &t) { s.ele.swap(t.ele); s.dp.swap(t.dp); } friend void merge(SL &s, SL &t) { if (t.ele.size() > s.ele.size()) swap(s, t); for (auto &x: t.ele) { for (int k = 5000; k >= x; --k) (s.dp[k] += s.dp[k - x]) %= MOD; s.ele.push_back(x); } } }; vector<vector<int>> adj; vector<ll> val; vector<SL> sl; ll n, k, ans; void dfs(int u, int p) { sl[u].ele.push_back(val[u]); sl[u].dp.assign(5001, 0); sl[u].dp[0] = sl[u].dp[val[u]] = 1; for (auto &v: adj[u]) { if (v == p) continue; dfs(v, u); merge(sl[u], sl[v]); } (ans += sl[u].dp[k]) %= MOD; } int main() { cin >> n >> k, ans = 0; adj.assign(n, {}); val.assign(n, {}); sl.assign(n, {}); for (auto &v: val) cin >> v; for (int i = 0; i < n - 1; ++i) { int u, v; cin >> u >> v; --u, --v; adj[u].push_back(v); adj[v].push_back(u); } dfs(0, 0); cout << ans << "\n"; }
Editor is loading...
Leave a Comment