Untitled
unknown
plain_text
a year ago
1.5 kB
13
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