ll power(ll a, int x){ ll ans = 1; while (x) { if (x & 1) ans = (ans * a) % mod; a = (a * a) % mod; x >>= 1; } return ans; }
voidinit(){ fac[0] = 1; for (int i = 1; i < N; i++) { fac[i] = fac[i - 1] * i % mod; } inv[N - 1] = power(fac[N - 1], mod - 2); for (int i = N - 2; i >= 0; i--) { inv[i] = inv[i + 1] * (i + 1) % mod; } }
ll C(int n, int k){ if (n < k)return0; return fac[n] * inv[k] % mod * inv[n - k] % mod; }
int n; int tt; int l[N], r[N], d[N], c[N]; vector<int> G[N]; ll dp[N];
voiddfs1(int u, int _fa){ c[u] = 1; for (int v:G[u]) { if (v == _fa)continue; dfs1(v, u); c[u] += c[v]; } }
voiddfs2(int u, int _fa){ dp[u] = 1; int m = c[u] - 1; for (int v:G[u]) { if (v == _fa)continue; dfs2(v, u); dp[u] = dp[u] * C(m, c[v]) % mod * dp[v] % mod; m -= c[v]; } }
typedef pair<int, int> pii;
structX { int id, l, r;
booloperator==(const X &b) const { return l == b.l && r == b.r; } };
boolcmp(const X &a, const X &b){ return a.l == b.l ? a.r > b.r : a.l < b.l; }
for (int i = 1; i <= n; i++)G[i].clear(), d[i] = 0,g[i].clear(),vis[i]=0; for(int i=1;i<=n;i++){ if(l[i]-1>=1)g[i].push_back(l[i]-1); if(r[i]+1<=n)g[i].push_back(r[i]+1); } for(int i=1;i<=n;i++){ if(!vis[i]){ if(!dfs(i))return0; } } vc.clear(); for (int i = 1; i <= n; i++)vc.push_back({i, l[i], r[i]}); sort(vc.begin(), vc.end(), cmp); if (vc[0].l != 1 || vc[0].r != n) { return0; } while (!st.empty())st.pop(); int flg = 1; for (int i = 0; i < (int) vc.size() && flg; i++) { X p = vc[i]; if (i != 0 && p == vc[i - 1]) { return0; } if (!st.empty() && p.l <= st.top().r && p.r > st.top().r) { return0; } while (!st.empty() && st.top().r < p.r) { st.pop(); } if (i != 0 && st.empty()) { return0; } if (!st.empty()) { if (st.top().r < p.r) { flg = 0;
break; } int u = st.top().id, v = p.id; if(p.l<=u && p.r >= u)return0; d[v]++; G[u].push_back(v); } st.push(p); } int rt = 0; for (int i = 1; i <= n; i++) if (d[i] == 0) { rt = i; break; } if (!rt)return0; dfs1(rt, 0); dfs2(rt, 0); for (int i = 1; i <= n; i++) if (!dp[i]) { return0; } return dp[rt]; }
#define debug(x) cout << #x << ":\t" << (x) << endl; usingnamespace std; #define ll long long #define ull unsigned ll constint N = 2e6 + 10; constint INF = 0x3f3f3f3f; const ll inf = 0x3f3f3f3f3f3f3f3f; const ll mod = 1e9 + 7; const ll inv2 = (mod + 1) / 2; constdouble eps = 1e-8; constdouble PI = acos(-1); typedef pair<int, int> pii; int T; int n, m, c[N], vis[N]; vector<int> G[N]; int siz[N], sum[N];
ll C(int n){ return1ll * n * (n - 1) / 2; }
ll ans;
voiddfs(int u, int _fa){ siz[u] = 1; int x = sum[c[u]]; for (int v:G[u]) { if (v == _fa)continue; int tmp = sum[c[u]]; dfs(v, u); siz[u] += siz[v]; ans += C(siz[v] - (sum[c[u]] - tmp)); } sum[c[u]] = x + siz[u]; }
intmain(){ while (~scanf("%d", &n)) { T++; for (int i = 1; i <= n; i++)G[i].clear(), vis[i] = 0, sum[i] = 0; ans = 0; m = 0; for (int i = 1; i <= n; i++) { scanf("%d", &c[i]); if (!vis[c[i]]) { m++; vis[c[i]] = 1; } } for (int i = 1; i < n; i++) { int u, v; scanf("%d%d", &u, &v); G[u].push_back(v); G[v].push_back(u); } dfs(1, 0); for (int i = 1; i <= n; i++)if (vis[i])ans += C(n - sum[i]); ans = 1ll * (n - 1) * n / 2 * m - ans; printf("Case #%d: %lld\n", T, ans); } return0; }
intmain(){ while (~scanf("%d%d%u%u%u", &n, &m, &x, &y, &z)) { T++; for (int i = 1; i <= n; i++)a[i] = rng61(); for (int i = 1; i <= m; i++) { scanf("%d", &b[i].q); b[i].id = i; } sort(b + 1, b + m + 1); for (int i = m; i >= 1; i--) { int q = b[i].q; if (i != m && b[i].q == b[i + 1].q) { ans[b[i].id] = a[q + 1]; continue; } nth_element(a + 1, a + q + 1, a + n + 1); ans[b[i].id] = a[q + 1]; n = q + 1; } printf("Case #%d: ", T); for (int i = 1; i <= m; i++)printf("%u%c", ans[i], " \n"[i == m]); } return0; }