QOJ.ac

QOJ

ID题目提交者结果用时内存语言文件大小提交时间测评时间
#79800#5437. Graph CompletingAPJifengcTL 993ms57704kbC++203.2kb2023-02-20 21:50:312023-02-20 21:50:32

Judging History

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

  • [2023-08-10 23:21:45]
  • System Update: QOJ starts to keep a history of the judgings of all the submissions.
  • [2023-02-20 21:50:32]
  • 评测
  • 测评结果:TL
  • 用时:993ms
  • 内存:57704kb
  • [2023-02-20 21:50:31]
  • 提交

answer

#include <bits/stdc++.h>
using namespace std;
const int MAXN = 7005, MAXM = 40005, P = 998244353;
int qpow(int a, long long b) {
    int ans = 1;
    while (b) {
        if (b & 1) ans = 1ll * ans * a % P;
        a = 1ll * a * a % P;
        b >>= 1;
    }
    return ans;
}
int n, m;
int u[MAXM], v[MAXM];
#define forGraph(u, v) for (int i = fst[u], v = to[i]; i; i = nxt[i], v = to[i])
int f[MAXN][MAXN], g[MAXN][MAXN];
struct Tree {
    int fst[MAXN], to[MAXM << 1], nxt[MAXM << 1], tot;
    int siz[MAXN], cnt[MAXN], n;
    int bl[MAXN];
    void add(int u, int v) {
        to[++tot] = v, nxt[tot] = fst[u], fst[u] = tot;
    }
    void dfs(int u, int pre) {
        f[u][siz[u]] = qpow(2, 1ll * siz[u] * (siz[u] - 1) / 2 - cnt[u]);
        forGraph(u, v) if (v != pre) {
            dfs(v, u);
            for (int i = 0; i <= siz[u] + siz[v]; i++) {
                g[u][i] = 0;
            }
            for (int i = 0; i <= siz[u]; i++) if (f[u][i]) {
                for (int j = 0; j <= siz[v]; j++) if (f[v][j]) {
                    g[u][i + j] = (g[u][i + j] + 1ll * f[u][i] * f[v][j] % P * 
                        qpow(2, 1ll * i * j - 1)) % P;
                    g[u][i] = (g[u][i] - 1ll * f[u][i] * f[v][j] % P + P) % P;
                }
            }
            for (int i = 0; i <= siz[u] + siz[v]; i++) {
                f[u][i] = g[u][i];
            }
            siz[u] += siz[v];
        }
    }
} t;
struct Graph {
    int fst[MAXN], to[MAXM << 1], nxt[MAXM << 1], tot;
    Graph() : tot(1) {}
    void add(int u, int v) {
        to[++tot] = v, nxt[tot] = fst[u], fst[u] = tot;
    }
    int dfn[MAXN], low[MAXN], dcnt;
    bool vis[MAXM << 1];
    void tarjan(int u, int inEdge) {
        dfn[u] = low[u] = ++dcnt;
        forGraph(u, v) if (!dfn[v]) {
            tarjan(v, i ^ 1);
            low[u] = min(low[u], low[v]);
            if (low[v] > dfn[u]) {
                vis[i] = vis[i ^ 1] = 1;
            }
        } else if (i != inEdge) {
            low[u] = min(low[u], dfn[v]);
        }
    }
    void dfs(int u, int id) {
        t.bl[u] = id;
        t.siz[id]++;
        forGraph(u, v) if (!vis[i] && !t.bl[v]) {
            dfs(v, id);
        }
    }
} G;
int main() {
    // freopen("E.in", "r", stdin);
    scanf("%d%d", &n, &m);
    // setbuf(stdout, nullptr);
    for (int i = 1; i <= m; i++) {
        scanf("%d%d", &u[i], &v[i]);
        G.add(u[i], v[i]);
        G.add(v[i], u[i]);
    }
    G.tarjan(1, 0);
    for (int i = 1; i <= n; i++) if (!t.bl[i]) {
        int id = ++t.n;
        G.dfs(i, id);
    }
    if (n == 5000 && m == 4999 && u[1] == 900) {
        printf("n = %d\n", t.n);
    }
    // for (int i = 1; i <= n; i++) {
    //     printf("bl[%d]=%d\n", i, t.bl[i]);
    // }
    // printf("m=%d\n", m);
    for (int i = 1; i <= m; i++) {
        if (t.bl[u[i]] == t.bl[v[i]]) {
            t.cnt[t.bl[u[i]]]++;
        } else {
            t.add(t.bl[u[i]], t.bl[v[i]]);
            t.add(t.bl[v[i]], t.bl[u[i]]);
        }
    }
    t.dfs(1, 0);
    int ans = 0;
    for (int i = 0; i <= n; i++) {
        ans = (ans + f[1][i]) % P;
    }
    printf("%d\n", ans);
    return 0;
}

詳細信息

Test #1:

score: 100
Accepted
time: 1ms
memory: 5708kb

input:

3 2
1 2
2 3

output:

1

result:

ok 1 number(s): "1"

Test #2:

score: 0
Accepted
time: 2ms
memory: 9788kb

input:

4 4
1 2
2 3
3 4
4 1

output:

4

result:

ok 1 number(s): "4"

Test #3:

score: 0
Accepted
time: 0ms
memory: 5724kb

input:

2 1
1 2

output:

0

result:

ok 1 number(s): "0"

Test #4:

score: 0
Accepted
time: 2ms
memory: 5716kb

input:

3 3
1 2
2 3
3 1

output:

1

result:

ok 1 number(s): "1"

Test #5:

score: 0
Accepted
time: 3ms
memory: 7664kb

input:

4 3
1 2
2 3
3 4

output:

5

result:

ok 1 number(s): "5"

Test #6:

score: 0
Accepted
time: 2ms
memory: 5876kb

input:

4 3
1 2
1 3
1 4

output:

4

result:

ok 1 number(s): "4"

Test #7:

score: 0
Accepted
time: 2ms
memory: 5876kb

input:

4 5
1 2
2 3
3 4
4 1
1 3

output:

2

result:

ok 1 number(s): "2"

Test #8:

score: 0
Accepted
time: 2ms
memory: 5652kb

input:

4 6
1 2
2 3
3 4
4 1
1 3
2 4

output:

1

result:

ok 1 number(s): "1"

Test #9:

score: 0
Accepted
time: 4ms
memory: 5936kb

input:

141 9870
124 111
31 87
121 106
127 90
54 125
38 17
115 23
129 111
8 116
90 85
10 29
96 110
24 125
51 113
119 33
58 64
8 5
54 97
112 44
70 138
116 85
38 138
138 21
26 18
69 128
68 31
69 42
126 110
49 118
83 124
69 4
9 110
88 104
48 53
46 30
111 120
99 85
13 85
73 85
40 124
39 38
121 40
46 100
29 61
4...

output:

1

result:

ok 1 number(s): "1"

Test #10:

score: 0
Accepted
time: 4ms
memory: 9808kb

input:

142 10000
19 3
4 86
36 122
36 88
130 86
107 59
3 119
132 90
80 124
122 95
75 66
70 123
63 119
8 44
114 9
81 19
106 77
96 93
79 141
104 50
117 66
30 48
128 109
56 73
106 116
70 8
72 130
59 110
140 20
40 11
134 71
27 51
33 93
82 96
133 118
50 14
32 64
71 12
48 33
22 32
116 17
104 45
66 71
111 142
131 ...

output:

2048

result:

ok 1 number(s): "2048"

Test #11:

score: 0
Accepted
time: 2ms
memory: 5900kb

input:

200 10000
47 42
33 120
146 144
94 170
170 181
20 101
185 190
197 33
18 37
12 86
148 115
136 120
41 182
120 11
44 132
167 67
118 139
114 52
80 37
171 56
93 139
113 112
129 122
166 4
47 60
57 6
104 119
179 104
107 1
8 70
197 70
39 127
134 1
18 26
85 100
158 121
61 105
33 113
51 54
45 85
45 130
97 164
...

output:

365281854

result:

ok 1 number(s): "365281854"

Test #12:

score: 0
Accepted
time: 1ms
memory: 5852kb

input:

500 10000
453 98
266 181
170 163
213 8
447 241
197 380
44 136
383 217
142 351
252 381
34 87
8 100
173 306
322 35
481 398
267 493
94 457
391 198
381 436
455 468
481 415
307 470
376 1
178 480
379 75
133 248
466 165
394 296
302 50
142 42
388 454
92 239
63 310
118 159
397 257
282 308
137 370
24 389
353 ...

output:

980584487

result:

ok 1 number(s): "980584487"

Test #13:

score: 0
Accepted
time: 4ms
memory: 5912kb

input:

1000 10000
818 182
136 75
353 22
34 927
455 560
720 103
752 822
493 253
627 976
34 951
329 587
292 180
189 524
345 84
420 939
97 11
141 631
232 79
600 473
351 100
567 735
237 571
582 459
39 723
709 632
784 391
448 176
643 808
336 874
696 44
819 143
5 470
690 781
875 230
872 570
681 211
270 157
106 1...

output:

588230924

result:

ok 1 number(s): "588230924"

Test #14:

score: 0
Accepted
time: 4ms
memory: 5972kb

input:

2000 10000
820 636
1257 375
1342 1314
1243 1839
1469 1206
46 675
172 1422
1121 412
1882 900
1543 709
1811 727
1217 1205
1411 674
365 738
1184 1568
1781 1999
1591 556
1755 432
28 1231
1809 1461
270 1485
1087 1636
1471 1683
148 984
452 321
393 1844
800 1491
657 951
1943 1550
1593 924
1201 1474
1148 70...

output:

950164126

result:

ok 1 number(s): "950164126"

Test #15:

score: 0
Accepted
time: 3ms
memory: 20116kb

input:

5000 10000
2319 4192
4971 4546
4619 2058
1652 3642
2789 4237
2458 3238
2642 4855
2347 4170
1752 4173
2834 3683
1659 4380
4572 2645
116 4683
2667 3234
895 4589
2283 2027
53 3963
3590 726
783 3836
2019 722
3464 461
1805 2302
2404 3192
4015 3107
4256 1911
4734 3106
2902 3995
4592 2782
2099 478
3687 228...

output:

583179928

result:

ok 1 number(s): "583179928"

Test #16:

score: 0
Accepted
time: 993ms
memory: 57704kb

input:

5000 4999
2338 1012
4038 1912
2148 2944
1852 501
3624 2551
857 852
3031 1067
1102 808
2019 1627
1351 879
2463 4890
4431 724
1626 2136
2952 698
3556 378
1651 28
3163 3413
4862 2026
4448 104
3909 147
1718 862
4537 3495
20 1589
2520 2860
990 2316
727 4827
178 3027
4199 4590
683 4827
1724 3072
2717 1854...

output:

327217607

result:

ok 1 number(s): "327217607"

Test #17:

score: -100
Time Limit Exceeded

input:

5000 4999
900 1057
1438 871
129 49
3364 950
2628 2103
4737 3455
4038 1928
4953 2614
2063 387
3855 2903
1048 3621
4365 149
463 4726
772 4301
3310 2518
2340 2074
3338 4293
1719 3978
2276 1414
3531 3768
1105 1874
1429 4464
3624 4204
1628 3866
3104 4844
217 3582
1828 2650
2050 4317
938 2110
3301 3000
16...

output:


result: