QOJ.ac
QOJ
ID | Problem | Submitter | Result | Time | Memory | Language | File size | Submit time | Judge time |
---|---|---|---|---|---|---|---|---|---|
#203196 | #7509. 01tree | ucup-team004# | AC ✓ | 36ms | 24864kb | C++20 | 3.9kb | 2023-10-06 16:04:25 | 2023-10-06 16:04:26 |
Judging History
answer
#include <bits/stdc++.h>
using i64 = long long;
constexpr int P = 1000000007;
constexpr int N = 200000;
int fac[N + 1], invfac[N + 1];
int power(int a, int b) {
int res = 1;
for (; b; b /= 2, a = 1LL * a * a % P) {
if (b % 2) {
res = 1LL * res * a % P;
}
}
return res;
}
int binom(int n, int m) {
if (n < m || m < 0) {
return 0;
}
return 1LL * fac[n] * invfac[m] % P * invfac[n - m] % P;
}
void solve() {
int n;
std::cin >> n;
std::vector<std::vector<int>> adj(n);
for (int i = 1; i < n; i++) {
int u, v;
std::cin >> u >> v;
u--, v--;
adj[u].push_back(v);
adj[v].push_back(u);
}
std::string s, t;
std::cin >> s >> t;
std::vector<int> s1(n), sq(n), t1(n), tq(n);
auto dfs = [&](auto self, int x, int p, int d) -> void {
if (s[x] == '?') {
sq[x] = 1;
} else if (s[x] == '0' + d) {
s1[x] = 1;
}
if (t[x] == '?') {
tq[x] = 1;
} else if (t[x] == '0' + d) {
t1[x] = 1;
}
for (auto y : adj[x]) {
if (y == p) {
continue;
}
self(self, y, x, d ^ 1);
s1[x] += s1[y];
sq[x] += sq[y];
t1[x] += t1[y];
tq[x] += tq[y];
}
};
dfs(dfs, 0, -1, 0);
int ans = 0;
int T = t1[0] + tq[0] - s1[0];
int Q = sq[0] + tq[0];
// for (int i = 1; i < n; i++) {
// int A = t1[i] + tq[i] - s1[i];
// int X = sq[i] + tq[i];
// for (int j = 0; j <= X; j++) {
// ans = (ans + 1LL * binom(X, j) * binom(Q - X, T - j) % P * std::abs(j - A)) % P;
// }
// }
// std::cout << ans << "\n";
std::vector<std::array<int, 2>> q;
constexpr int B = 300;
for (int i = 1; i < n; i++) {
int A = t1[i] + tq[i] - s1[i];
int X = sq[i] + tq[i];
q.push_back({X, A});
}
std::sort(q.begin(), q.end(),
[&](auto a, auto b) {
if (a[0] / B != b[0] / B) {
return a[0] < b[0];
} else {
return a[1] < b[1];
}
});
int X = 0, A = 0;
int F = 0, G = 0, H = 0;
F = 1LL * binom(Q, T) * std::abs(A) % P;
G = binom(Q, T);
for (auto [x, a] : q) {
while (A < a) {
F = (F + 2LL * G - binom(Q, T) + P) % P;
G = (G + 1LL * binom(X, A + 1) * binom(Q - X, T - A - 1)) % P;
H = (H + 1LL * binom(X, A) * binom(Q - 1 - X, T - 1 - A)) % P;
A++;
}
while (A > a) {
A--;
H = (H + 1LL * (P - binom(X, A)) * binom(Q - 1 - X, T - 1 - A)) % P;
G = (G + 1LL * (P - binom(X, A + 1)) * binom(Q - X, T - A - 1)) % P;
F = (F + 2LL * (P - G) + binom(Q, T)) % P;
}
while (X < x) {
F = (F + binom(Q - 1, T - 1) + 2LL * (P - H)) % P;
G = (G + 1LL * (P - binom(X, A)) * binom(Q - 1 - X, T - 1 - A)) % P;
H = (H + 1LL * (P - binom(X, A - 1)) * binom(Q - 2 - X, T - 1 - A)) % P;
X++;
}
while (X > x) {
X--;
H = (H + 1LL * binom(X, A - 1) * binom(Q - 2 - X, T - 1 - A)) % P;
G = (G + 1LL * binom(X, A) * binom(Q - 1 - X, T - 1 - A)) % P;
F = (F - binom(Q - 1, T - 1) + P + 2LL * H) % P;
}
ans = (ans + F) % P;
}
std::cout << ans << "\n";
}
int main() {
std::ios::sync_with_stdio(false);
std::cin.tie(nullptr);
fac[0] = 1;
for (int i = 1; i <= N; i++) {
fac[i] = 1LL * fac[i - 1] * i % P;
}
invfac[N] = power(fac[N], P - 2);
for (int i = N; i; i--) {
invfac[i - 1] = 1LL * invfac[i] * i % P;
}
int t;
std::cin >> t;
while (t--) {
solve();
}
return 0;
}
Details
Tip: Click on the bar to expand more detailed information
Test #1:
score: 100
Accepted
time: 3ms
memory: 4992kb
input:
3 2 1 2 00 11 3 1 2 2 3 ??? ??? 3 1 2 2 3 ??1 0?0
output:
1 16 1
result:
ok 3 number(s): "1 16 1"
Test #2:
score: 0
Accepted
time: 3ms
memory: 5132kb
input:
1000 23 1 2 1 3 1 4 2 5 5 6 4 7 3 8 4 9 8 10 8 11 8 12 1 13 7 14 10 15 7 16 7 17 5 18 18 19 12 20 9 21 21 22 6 23 00?10?0000??1?00111?010 011??1?10?01?110?0??101 6 1 2 1 3 1 4 4 5 3 6 000?10 1???01 25 1 2 2 3 2 4 4 5 5 6 2 7 4 8 5 9 7 10 8 11 11 12 5 13 11 14 3 15 6 16 14 17 1 18 4 19 6 20 4 21 5 22...
output:
53545 24 11724 2228 162 14 711 28 550 1680 52 2 13 988 9480 2342 626416 0 71780 1 88 39207 19448 4 37395 9602 3253496 38057200 1066 3 303732 1608 281022 11718 170 78 15 1219376 29364 9092 7 0 2 7014 1942448 170371 75845 167217 16554 64 904 564290 14822 1127090 1758504 1227646 14833316 14954550 36055...
result:
ok 1000 numbers
Test #3:
score: 0
Accepted
time: 4ms
memory: 5284kb
input:
1 3000 1 2 2 3 2 4 1 5 3 6 2 7 5 8 8 9 9 10 10 11 2 12 11 13 7 14 11 15 7 16 13 17 8 18 1 19 11 20 10 21 18 22 7 23 7 24 15 25 23 26 24 27 14 28 15 29 25 30 16 31 6 32 10 33 3 34 30 35 16 36 9 37 36 38 28 39 26 40 33 41 1 42 11 43 20 44 23 45 14 46 31 47 41 48 11 49 48 50 45 51 6 52 10 53 32 54 38 5...
output:
924036898
result:
ok 1 number(s): "924036898"
Test #4:
score: 0
Accepted
time: 4ms
memory: 5356kb
input:
1 3000 1 2 1 3 2 4 2 5 3 6 3 7 4 8 4 9 5 10 5 11 6 12 6 13 7 14 7 15 8 16 8 17 9 18 9 19 10 20 10 21 11 22 11 23 12 24 12 25 13 26 13 27 14 28 14 29 15 30 15 31 16 32 16 33 17 34 17 35 18 36 18 37 19 38 19 39 20 40 20 41 21 42 21 43 22 44 22 45 23 46 23 47 24 48 24 49 25 50 25 51 26 52 26 53 27 54 2...
output:
429465738
result:
ok 1 number(s): "429465738"
Test #5:
score: 0
Accepted
time: 4ms
memory: 5672kb
input:
1 3000 1 2 2 3 3 4 4 5 5 6 6 7 7 8 8 9 9 10 10 11 11 12 12 13 13 14 14 15 15 16 16 17 17 18 18 19 19 20 20 21 21 22 22 23 23 24 24 25 25 26 26 27 27 28 28 29 29 30 30 31 31 32 32 33 33 34 34 35 35 36 36 37 37 38 38 39 39 40 40 41 41 42 42 43 43 44 44 45 45 46 46 47 47 48 48 49 49 50 50 51 51 52 52 5...
output:
650625747
result:
ok 1 number(s): "650625747"
Test #6:
score: 0
Accepted
time: 32ms
memory: 13160kb
input:
1 100000 1 2 1 3 3 4 1 5 2 6 6 7 2 8 1 9 6 10 1 11 3 12 11 13 5 14 9 15 12 16 6 17 13 18 13 19 14 20 7 21 14 22 21 23 12 24 17 25 14 26 3 27 4 28 8 29 22 30 12 31 6 32 30 33 4 34 15 35 12 36 3 37 20 38 7 39 37 40 5 41 13 42 34 43 9 44 27 45 39 46 43 47 3 48 17 49 36 50 12 51 1 52 45 53 35 54 15 55 2...
output:
143309878
result:
ok 1 number(s): "143309878"
Test #7:
score: 0
Accepted
time: 26ms
memory: 12916kb
input:
1 100000 1 2 1 3 2 4 2 5 3 6 3 7 4 8 4 9 5 10 5 11 6 12 6 13 7 14 7 15 8 16 8 17 9 18 9 19 10 20 10 21 11 22 11 23 12 24 12 25 13 26 13 27 14 28 14 29 15 30 15 31 16 32 16 33 17 34 17 35 18 36 18 37 19 38 19 39 20 40 20 41 21 42 21 43 22 44 22 45 23 46 23 47 24 48 24 49 25 50 25 51 26 52 26 53 27 54...
output:
724432513
result:
ok 1 number(s): "724432513"
Test #8:
score: 0
Accepted
time: 15ms
memory: 24864kb
input:
1 100000 1 2 2 3 3 4 4 5 5 6 6 7 7 8 8 9 9 10 10 11 11 12 12 13 13 14 14 15 15 16 16 17 17 18 18 19 19 20 20 21 21 22 22 23 23 24 24 25 25 26 26 27 27 28 28 29 29 30 30 31 31 32 32 33 33 34 34 35 35 36 36 37 37 38 38 39 39 40 40 41 41 42 42 43 43 44 44 45 45 46 46 47 47 48 48 49 49 50 50 51 51 52 52...
output:
164448583
result:
ok 1 number(s): "164448583"
Test #9:
score: 0
Accepted
time: 36ms
memory: 13176kb
input:
1 100000 1 2 1 3 1 4 4 5 2 6 5 7 3 8 5 9 9 10 6 11 4 12 6 13 11 14 1 15 6 16 15 17 6 18 6 19 8 20 11 21 1 22 11 23 20 24 9 25 2 26 5 27 14 28 7 29 28 30 10 31 7 32 17 33 2 34 24 35 14 36 10 37 2 38 5 39 39 40 14 41 35 42 25 43 33 44 11 45 41 46 1 47 33 48 36 49 25 50 20 51 13 52 4 53 46 54 45 55 21 ...
output:
159386883
result:
ok 1 number(s): "159386883"
Test #10:
score: 0
Accepted
time: 22ms
memory: 13060kb
input:
1 100000 1 2 1 3 2 4 2 5 3 6 3 7 4 8 4 9 5 10 5 11 6 12 6 13 7 14 7 15 8 16 8 17 9 18 9 19 10 20 10 21 11 22 11 23 12 24 12 25 13 26 13 27 14 28 14 29 15 30 15 31 16 32 16 33 17 34 17 35 18 36 18 37 19 38 19 39 20 40 20 41 21 42 21 43 22 44 22 45 23 46 23 47 24 48 24 49 25 50 25 51 26 52 26 53 27 54...
output:
752214506
result:
ok 1 number(s): "752214506"
Test #11:
score: 0
Accepted
time: 32ms
memory: 24784kb
input:
1 100000 1 2 2 3 3 4 4 5 5 6 6 7 7 8 8 9 9 10 10 11 11 12 12 13 13 14 14 15 15 16 16 17 17 18 18 19 19 20 20 21 21 22 22 23 23 24 24 25 25 26 26 27 27 28 28 29 29 30 30 31 31 32 32 33 33 34 34 35 35 36 36 37 37 38 38 39 39 40 40 41 41 42 42 43 43 44 44 45 45 46 46 47 47 48 48 49 49 50 50 51 51 52 52...
output:
419022702
result:
ok 1 number(s): "419022702"