QOJ.ac

QOJ

IDProblemSubmitterResultTimeMemoryLanguageFile sizeSubmit timeJudge time
#325660#946. Magic TreeCamillus#0 1ms4088kbC++202.9kb2024-02-11 19:03:352024-07-04 03:23:35

Judging History

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

  • [2024-07-04 03:23:35]
  • 评测
  • 测评结果:0
  • 用时:1ms
  • 内存:4088kb
  • [2024-02-11 19:03:35]
  • 提交

answer

/// @author Camillus <3
#include "bits/stdc++.h"

using ull = unsigned long long;
using namespace std;

struct mint {
    static constexpr int mod = 998'244'353;
    int value = 0;

    mint() = default;
    mint(int value) : value(value) {}

    mint& operator+=(const mint &other) {
        value += other.value;
        if (value >= mod) {
            value -= mod;
        }
        return *this;
    }

    mint operator+(const mint &other) const {
        return mint(value) += other;
    }

    mint& operator-=(const mint &other) {
        value += mod - other.value;
        if (value >= mod) {
            value -= mod;
        }
        return *this;
    }

    mint operator-(const mint &other) const {
        return mint(value) -= other;
    }

    mint &operator*=(const mint &other) {
        value = 1ll * value * other.value % mod;
        return *this;
    }

    mint operator*(const mint &other) const {
        return mint(value) *= other;
    }

    mint power(int k) const {
        mint result = 1;
        mint current = *this;

        while (k) {
            if (k & 1) {
                result *= current;
            }
            current *= current;
            k >>= 1;
        }

        return result;
    }

    mint &operator/=(const mint &other) {
        return this->operator*=(other.power(mod - 2));
    }

    mint operator/(const mint &other) const {
        return mint(value) /= other;
    }

    friend ostream& operator<<(ostream &out, const mint &other) {
        return out << other.value;
    }

    friend istream& operator>>(istream &in, mint &other) {
        return in >> other.value;
    }
};

vector<int> g[18];

unordered_map<ull, mint> saved;

int n;

mint calc(ull maskA, ull maskB) {
    if (maskA == (1 << n) - 1 && maskB == 0) {
        return 1;
    } else if (maskB == 0) {
        return 0;
    }

    if (saved.contains(maskA << n | maskB)) {
        return saved[maskA << n | maskB];
    }

    bitset<18> A(maskA);
    bitset<18> B(maskB);

    mint sum = 0;

    for (int u = 0; u < n; u++) {
        if (B[u]) {
            B[u] = false;
            auto Ap = A;
            Ap[u] = true;

            auto Bp = B;

            for (int v : g[u]) {
                if (!A[v]) {
                    Bp[v] = true;
                }
            }

            sum += calc(Ap.to_ullong(), Bp.to_ullong());
        }
    }

    return saved[maskA << n | maskB] = sum;
}

signed main() {
    ios::sync_with_stdio(false);
    cin.tie(nullptr);

    saved.reserve(1e5);

    int m;
    cin >> n >> m;

    for (int i = 0; i < m; i++) {
        int u, v;
        cin >> u >> v;

        u--, v--;

        g[u].push_back(v);
        g[v].push_back(u);
    }

    cout << calc(0, (1 << n) - 1) / 2 << '\n';
    return 0;
}

Details

Tip: Click on the bar to expand more detailed information

Subtask #1:

score: 0
Wrong Answer

Test #1:

score: 0
Wrong Answer
time: 1ms
memory: 4088kb

input:

10 9 10
1
1
2
2
3
1
3
8
3
5 4 1
9 4 1
6 8 1
3 1 1
4 9 1
10 1 1
2 6 1
8 7 1
7 9 1

output:

192

result:

wrong answer expected '7', found '192'

Subtask #2:

score: 0
Runtime Error

Test #10:

score: 0
Runtime Error

input:

100000 25000 100000
1
1
2
1
2
1
5
8
8
2
5
2
2
3
1
2
11
10
18
2
9
9
9
8
1
19
18
22
20
17
20
13
30
5
9
8
13
2
19
26
14
31
23
22
2
21
8
1
22
9
50
19
49
42
47
19
21
57
9
52
41
39
10
14
60
56
34
17
18
22
53
5
34
64
29
72
33
11
9
67
58
10
58
70
57
26
65
10
15
64
67
20
26
13
51
81
11
78
40
53
70
33
34
92
7...

output:


result:


Subtask #3:

score: 0
Runtime Error

Test #15:

score: 0
Runtime Error

input:

1000 500 1000
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
9...

output:


result:


Subtask #4:

score: 0
Runtime Error

Test #21:

score: 0
Runtime Error

input:

100000 90000 2
1
1
3
2
1
2
1
5
1
8
11
9
1
8
12
7
1
2
7
6
12
9
16
18
13
10
23
27
26
17
23
10
24
11
21
13
30
1
11
6
13
8
30
15
17
34
39
41
32
29
27
17
21
12
26
33
10
50
29
17
46
33
21
28
47
26
3
67
38
5
10
45
61
70
59
17
46
40
20
58
67
68
15
62
71
71
57
32
81
18
66
7
14
51
67
92
86
38
88
60
45
54
5
59...

output:


result:


Subtask #5:

score: 0
Skipped

Dependency #1:

0%

Subtask #6:

score: 0
Runtime Error

Test #31:

score: 0
Runtime Error

input:

20000 800 60000
1
1
1
2
3
1
7
8
6
1
7
6
1
7
14
16
11
13
14
3
11
11
4
2
5
24
20
24
16
30
15
3
24
31
12
7
2
29
14
25
39
23
16
33
32
33
34
9
13
37
33
23
15
21
28
39
51
19
6
50
54
55
8
40
3
7
34
19
28
15
61
18
22
28
38
15
47
37
42
73
38
61
10
7
30
58
41
43
69
89
62
84
30
68
92
84
43
59
44
75
8
100
83
18...

output:


result:


Subtask #7:

score: 0
Skipped

Dependency #3:

0%

Subtask #8:

score: 0
Skipped

Dependency #1:

0%