Untitled

 avatar
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