Untitled
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