Untitled

 avatar
unknown
plain_text
a year ago
1.5 kB
8
Indexable
#include<bits/stdc++.h>
using namespace std;
using ll = long long;
vector<vector<ll>> adj, dp;
vector<int> MX, sz, depth;
int n, m, MOD = 1e9 + 7;
string s;
ll power(ll b, ll p) {
    ll res = 1;
    for (; p; b = b * b % MOD, p >>= 1) if (p & 1) res = res * b % MOD;
    return res;
}
void dfs(int u, int p) {
    sz[u] = 1, MX[u] = 1;
    for (auto &v: adj[u]) {
        if (v == p) continue;
        depth[v] = depth[u] + 1;
        dfs(v, u);
        MX[u] = max(MX[u], MX[v] + 1);
        sz[u] += sz[v];
    }
}
ll solve(int u, int p, bool equ) {
    if (!equ || MX[u] + depth[u] < m) return power(10, sz[u]);
    ll &ret = dp[u][equ];
    if (~ret)
        return ret;
    ret = 0;
    int l = -1;
    int r = 0;
    if (MX[u] <= m)
        r = s[m - MX[u]] - '0';
    while (++l <= r) {
        bool e = (l == r);
        ll res = 1;
        for (auto &v: adj[u]) {
            if (v == p) continue;
            res = (res * solve(v, u, e)) % MOD;
        }
        ret = (ret + res) % MOD;
    }
    return ret;
}
int main() {
    ios::sync_with_stdio(false);
    cin.tie(nullptr), cout.tie(nullptr);
    cin >> n;
    adj.assign(n, {});
    dp.assign(n, {-1, -1});
    MX.assign(n, 0);
    sz.assign(n, 0);
    depth.assign(n, 0);
    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);
    }
    cin >> m >> s;
    dfs(0, 0);
    cout << solve(0, 0, true) << "\n";
}
Editor is loading...
Leave a Comment