QOJ.ac

QOJ

ID题目提交者结果用时内存语言文件大小提交时间测评时间
#203196#7509. 01treeucup-team004#AC ✓36ms24864kbC++203.9kb2023-10-06 16:04:252023-10-06 16:04:26

Judging History

你现在查看的是最新测评结果

  • [2023-10-06 16:04:26]
  • 评测
  • 测评结果:AC
  • 用时:36ms
  • 内存:24864kb
  • [2023-10-06 16:04:25]
  • 提交

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;
}

詳細信息

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"