#include <cstdint> #include <iostream> #include <vector> using namespace std; int main() { constexpr int MOD = 1e9 + 7; // construct int n, k; cin >> n >> k; vector<vector<int>> tree(n); vector<bool> marked(n); for (int i = 0; i != k; ++i) { int index; cin >> index; --index; marked[index] = true; } for (int i = 0; i != n - 1; ++i) { int u, v; cin >> u >> v; --u; --v; tree[u].push_back(v); tree[v].push_back(u); } // dfs vector<bool> visited(n); auto dfs = [&](auto&& dfs, int node, int parent) -> int { visited[node] = true; int count = 0; for (int neighbor : tree[node]) { if (!marked[neighbor]) { ++count; } else if (neighbor != parent) { count += dfs(dfs, neighbor, node); } } return count; }; int count = 0; uintmax_t ways = 1; for (int i = 0; i < marked.size(); ++i) { if (marked[i] && !visited[i]) { ++count; ways = (ways * dfs(dfs, i, -1)) % MOD; } } cout << count << ' ' << ways; } // 64 位输出请用 printf("%lld")