记录编号 615959 评测结果 AAAAAA
题目名称 [ICPC2026河南省赛]蜗牛养殖 最终得分 100
用户昵称 GravatarRpUtl 是否通过 通过
代码语言 C++ 运行时间 0.377 s
提交时间 2026-05-28 14:30:36 内存使用 11.49 MiB
显示代码纯文本
#include <bits/stdc++.h>
using namespace std;
const int N = 1e5 + 10;
const int mod = 998244353;
typedef long long ll;
int n, k, mk[N];
ll dp[N][3], g[3], ans;
vector<int>G[N];
void add(int x, int y) {
    G[x].push_back(y);
}
void dfs(int x, int fa) {
    dp[x][0] = 1;
    for (auto y : G[x]) {
        if (y == fa) {
            continue;
        }
        dfs(y, x);
        for (int i = 0; i < 3; ++i) {
            g[i] = dp[x][i];
        }
        g[0] = (dp[x][0] * dp[y][0]) % mod;
        g[1] = (dp[x][0] * dp[y][1] % mod + dp[x][1] * dp[y][1] % mod + dp[x][1] * dp[y][0] % mod) % mod;
        g[2] = (dp[x][0] * dp[y][2] % mod + dp[x][2] * dp[y][2] % mod + dp[x][2] * dp[y][0] % mod) % mod;
        for (int i = 0; i < 3; ++i) {
            dp[x][i] = g[i];
        }
    }

    if (x != 1) {
        if (mk[x]) {
            dp[x][1] = dp[x][2] = dp[x][0], dp[x][0] = 0;
        } else {
            dp[x][0] = (dp[x][0] * 2 + dp[x][1] + dp[x][2]) % mod;
        }
    } else {
        if (!mk[1]) {
            ans = (dp[x][0] + dp[x][1] + dp[x][2]) % mod;
        } else {
            ans = dp[x][0];
        }
    }


    return;
}
int main() {
    scanf("%d %d", &n, &k);
    for (int i = 1, x; i <= k; i++) {
        scanf("%d", &x);
        mk[x] = 1;
    }
    for (int i = 1, u, v; i < n; i++) {
        scanf("%d %d", &u, &v);
        add(u, v), add(v, u);
    }
    dfs(1, 0);
    cout << ans << endl;
    return 0;
}