Untitled
unknown
plain_text
a year ago
1.3 kB
10
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