QOJ.ac

QOJ

IDProblemSubmitterResultTimeMemoryLanguageFile sizeSubmit timeJudge time
#709987#7514. Clique Challengetest_algthTL 324ms13772kbC++142.9kb2024-11-04 17:47:482024-11-04 17:47:49

Judging History

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

  • [2024-11-04 17:47:49]
  • 评测
  • 测评结果:TL
  • 用时:324ms
  • 内存:13772kb
  • [2024-11-04 17:47:48]
  • 提交

answer

#include <bits/stdc++.h>

const int MAXN = 2024;
const int P = 1e9 + 7;
int N, M, ans;
std::vector <int> adj[MAXN], G[MAXN];
int deg[MAXN], I[MAXN], rk[MAXN];
std::bitset <MAXN> vis[MAXN];

inline int add(int a, int b) {
  return a -= (a += b) >= P ? P : 0;
}

inline void incr(int& a, int b) {
  a = add(a, b);
}

std::pair <std::vector <int>, std::vector <int>> solve(std::vector <int> nodes) {
  int n = nodes.size();
  std::vector <int> f(1 << n, 0), g(1 << n, 0);
  f[0] = 1, g[0] = 1;
  for (int s = 0; s < (1 << n); ++s) {
    if (!g[s]) continue;
    for (int u = 0; u < n; ++u) {
      if (s >> u & 1) continue;
      bool ok = true;
      for (int v = 0; v < n && ok; ++v) {
        if (s >> v & 1) {
          ok &= vis[nodes[u]][nodes[v]];
        }
      }

      if (ok)
        f[s | (1 << u)] = 1, g[s | (1 << u)] = 1;
      // std::cout << s << " " << (ok ? 1 : 0) << '\n';
    }
  }

  for (int i = 0; i < n; ++i) {
    for (int s = 0; s < (1 << n); ++s) {
      if (s >> i & 1) {
        incr(f[s], f[s ^ (1 << i)]);
      }
    }
  }

  return {f, g};
}

inline int calc(std::vector <int> nodes) {
  int n = nodes.size();
  if (n == 1) return 1;
  std::vector <int> leftNodes, rightNodes;
  for (int i = 0; i < (n >> 1); ++i) {
    leftNodes.push_back(nodes[i]);
  }

  for (int i = n >> 1; i < n; ++i) {
    rightNodes.push_back(nodes[i]);
  }

  // std::cout << "nodes : ";
  // for (int i = 0; i < n; ++i) {
  //   std::cout << nodes[i] << " \n"[i == n - 1];
  // }

  auto [leftF, leftG] = solve(leftNodes);
  auto [rightF, rightG] = solve(rightNodes);
  
  int leftN = leftNodes.size();
  int rightN = rightNodes.size();

  std::vector <int> permit(leftN, (1 << rightN) - 1);
  for (int i = 0; i < leftN; ++i) {
    for (int j = 0; j < rightN; ++j) {
      if (!vis[leftNodes[i]][rightNodes[j]]) {
        permit[i] -= 1 << j;
      }
    }
  }

  int all = 0;
  for (int s = 0; s < (1 << leftN); ++s) {
    if (leftG[s] && (s & 1)) {
      int t = (1 << rightN) - 1;
      for (int i = 0; i < leftN; ++i) {
        if (s >> i & 1) {
          t &= permit[i];
        }
      }

      incr(all, rightF[t]);
    }
  }

  return all;
}

int main() {
  std::ios::sync_with_stdio(false);
  std::cin.tie(nullptr);
  std::cout.tie(nullptr);

  std::cin >> N >> M;
  for (int i = 1, u, v; i <= M; ++i) {
    std::cin >> u >> v;
    adj[u].push_back(v);
    adj[v].push_back(u);
    ++deg[u], ++deg[v];
    vis[u][v] = vis[v][u] = 1;
  }

  std::iota(I + 1, I + 1 + N, 1);
  std::sort(I + 1, I + 1 + N, [&](const int a, const int b) { return deg[a] < deg[b]; });
  for (int i = 1; i <= N; ++i) rk[I[i]] = i;
  for (int i = 1; i <= N; ++i) {
    int u = I[i];
    std::vector <int> nodes = {u};
    for (int v : adj[u]) {
      if (rk[v] > i) {
        nodes.push_back(v);
      }
    }

    incr(ans, calc(nodes));
  }

  std::cout << ans << '\n';
  return 0;
}

Details

Tip: Click on the bar to expand more detailed information

Test #1:

score: 100
Accepted
time: 0ms
memory: 3740kb

input:

3 2
1 2
2 3

output:

5

result:

ok single line: '5'

Test #2:

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

input:

3 3
1 2
1 3
2 3

output:

7

result:

ok single line: '7'

Test #3:

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

input:

1000 100
446 789
167 547
254 777
777 185
33 446
777 847
185 877
757 167
72 383
847 446
254 478
959 185
757 446
847 959
959 167
757 847
747 757
446 167
989 757
547 777
33 747
33 254
254 843
33 547
446 980
877 205
185 72
980 959
33 205
877 757
33 847
478 843
757 478
167 877
72 789
877 959
980 478
167 ...

output:

1373

result:

ok single line: '1373'

Test #4:

score: 0
Accepted
time: 152ms
memory: 13708kb

input:

1000 1000
770 105
219 498
686 498
343 534
15 591
919 588
149 588
298 915
551 523
710 116
105 637
523 991
343 476
145 420
604 588
254 120
551 421
476 298
900 710
915 343
445 421
986 867
445 588
219 356
919 105
584 875
991 604
776 919
588 254
919 421
356 348
105 551
15 113
919 15
356 523
343 155
770 9...

output:

6621319

result:

ok single line: '6621319'

Test #5:

score: 0
Accepted
time: 144ms
memory: 13772kb

input:

1000 1000
840 251
559 572
77 993
857 254
176 77
30 423
838 251
862 466
920 254
254 593
593 423
780 575
487 865
952 176
480 77
351 487
620 390
231 496
423 761
993 385
383 390
220 620
862 805
920 838
77 339
838 231
691 384
930 251
840 77
593 993
838 930
176 761
383 761
480 487
251 383
295 390
289 808
...

output:

6403686

result:

ok single line: '6403686'

Test #6:

score: 0
Accepted
time: 145ms
memory: 9444kb

input:

1000 1000
179 73
322 80
586 342
73 819
973 184
508 131
351 342
576 179
397 23
523 926
684 73
479 722
973 80
576 397
301 508
903 618
672 192
33 903
973 885
523 661
885 8
787 988
647 990
393 211
722 586
751 926
960 322
179 131
131 988
196 342
508 351
672 342
644 926
990 819
301 80
73 397
104 131
678 3...

output:

6066915

result:

ok single line: '6066915'

Test #7:

score: 0
Accepted
time: 143ms
memory: 13696kb

input:

1000 1000
179 707
71 73
410 726
459 410
84 432
500 73
578 864
71 145
538 578
265 145
707 565
674 772
859 676
826 71
538 459
548 479
609 45
674 707
30 145
45 726
41 73
446 265
145 479
587 642
179 632
908 548
674 410
361 632
500 642
929 976
73 446
41 361
71 726
179 212
341 929
45 859
826 179
632 144
4...

output:

6242289

result:

ok single line: '6242289'

Test #8:

score: 0
Accepted
time: 141ms
memory: 9500kb

input:

1000 1000
146 917
487 589
225 927
972 449
969 728
99 288
615 564
728 146
880 561
563 745
442 880
118 392
634 564
636 917
442 738
280 254
225 710
254 449
221 564
394 969
556 99
634 589
976 301
117 487
561 867
98 880
392 880
917 819
556 634
941 969
653 927
972 615
146 819
969 98
653 941
809 699
590 30...

output:

9171879

result:

ok single line: '9171879'

Test #9:

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

input:

1000 1000
709 558
844 316
552 395
944 619
805 279
837 392
822 772
964 805
597 397
814 344
527 401
964 299
922 782
746 349
795 537
945 57
527 176
815 937
257 955
245 108
245 593
932 155
597 812
18 856
116 218
671 142
511 945
481 405
966 695
782 38
130 638
470 692
671 307
837 571
925 43
411 249
613 38...

output:

2186

result:

ok single line: '2186'

Test #10:

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

input:

1000 1000
833 350
567 76
488 416
350 135
874 275
555 996
263 152
14 380
409 442
672 836
490 5
421 901
781 875
135 209
162 442
6 47
111 180
317 162
876 368
393 656
712 535
583 976
918 591
29 887
436 599
702 5
512 778
901 111
423 591
274 599
686 655
2 656
444 172
836 800
865 920
3 19
781 375
157 683
8...

output:

2193

result:

ok single line: '2193'

Test #11:

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

input:

1000 1000
655 894
253 168
615 321
526 160
225 578
845 473
14 839
321 659
138 448
575 787
342 557
338 501
192 504
888 172
531 616
83 136
623 137
746 344
385 337
505 394
634 740
242 449
321 630
804 971
386 160
466 641
83 133
570 527
448 273
888 653
3 479
467 18
630 93
271 574
653 5
764 370
972 466
501...

output:

2159

result:

ok single line: '2159'

Test #12:

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

input:

1000 1000
210 626
59 74
95 486
328 63
894 222
908 764
299 197
871 600
954 241
431 660
816 997
186 34
737 604
889 568
454 115
61 933
417 221
279 971
333 340
143 374
168 409
426 50
875 423
86 413
805 719
222 319
461 864
244 679
49 220
98 579
329 737
568 926
328 330
694 445
318 480
576 748
242 989
968 ...

output:

2013

result:

ok single line: '2013'

Test #13:

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

input:

1000 1000
937 639
771 95
626 134
869 66
465 29
889 944
194 239
284 303
935 111
795 806
737 770
665 343
862 528
232 571
342 458
401 490
452 628
425 384
998 578
192 168
64 651
486 311
840 667
400 255
364 206
486 289
761 912
189 907
158 339
891 336
392 782
598 233
899 539
19 780
190 535
933 700
500 232...

output:

2004

result:

ok single line: '2004'

Test #14:

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

input:

1000 1000
568 607
217 544
12 124
766 801
924 290
957 218
816 552
913 189
982 916
896 289
304 74
426 190
844 543
849 972
386 59
626 472
869 838
234 581
232 707
623 685
873 344
295 496
352 557
314 35
329 432
155 422
803 322
42 735
36 760
249 306
706 533
748 161
887 911
872 64
440 450
662 607
274 659
7...

output:

2002

result:

ok single line: '2002'

Test #15:

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

input:

1000 1000
726 492
65 652
168 218
347 489
35 415
73 324
80 419
237 352
378 3
708 286
933 810
116 563
819 610
670 386
392 940
434 926
341 617
820 842
618 974
592 344
724 578
955 761
26 902
545 496
688 636
273 225
749 840
661 784
917 595
503 84
414 252
925 877
352 479
792 914
54 666
324 257
642 637
801...

output:

2002

result:

ok single line: '2002'

Test #16:

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

input:

1000 1000
344 107
264 268
28 38
211 260
741 682
654 885
607 213
610 296
869 556
685 269
996 929
61 370
804 605
786 570
41 448
104 549
245 166
36 84
265 135
704 409
60 299
895 645
868 140
3 483
448 341
778 460
930 13
796 688
936 751
808 458
859 502
918 43
920 287
680 976
918 172
378 156
962 834
635 3...

output:

2002

result:

ok single line: '2002'

Test #17:

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

input:

1000 1000
117 152
117 375
190 586
117 586
278 546
788 450
117 90
511 586
450 595
586 492
870 278
17 117
586 275
520 471
796 117
520 112
117 431
292 520
320 520
278 95
586 677
450 402
298 520
586 109
450 409
520 607
684 278
520 898
340 278
17 520
586 64
586 100
520 647
450 270
520 617
685 117
117 985...

output:

6290

result:

ok single line: '6290'

Test #18:

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

input:

1000 1000
88 346
534 200
881 661
869 23
35 869
26 785
158 785
881 981
835 881
88 466
88 559
760 88
905 869
869 672
869 256
945 534
881 664
905 30
631 868
536 124
869 271
712 88
534 30
513 785
785 902
491 869
869 868
505 869
488 897
905 144
88 513
785 536
785 599
303 905
534 869
158 897
384 905
236 9...

output:

132867

result:

ok single line: '132867'

Test #19:

score: 0
Accepted
time: 16ms
memory: 3900kb

input:

1000 1000
463 338
246 242
91 76
130 858
818 250
255 639
135 571
809 250
794 255
91 170
386 678
639 513
507 684
463 407
463 969
463 769
685 463
250 513
126 684
684 444
53 969
250 876
811 639
286 571
386 684
571 407
794 463
507 463
295 170
678 809
91 678
811 349
777 53
463 286
261 401
130 346
91 625
8...

output:

9143208

result:

ok single line: '9143208'

Test #20:

score: 0
Accepted
time: 324ms
memory: 5052kb

input:

1000 1000
624 79
120 926
418 455
310 792
116 165
688 185
34 792
985 129
884 79
624 847
356 494
79 785
15 891
792 455
274 554
891 518
453 116
792 188
356 57
884 669
926 940
608 673
847 884
884 455
871 985
418 15
185 926
871 608
78 145
554 494
356 669
129 792
624 129
274 79
284 129
688 116
940 650
884...

output:

119880110

result:

ok single line: '119880110'

Test #21:

score: -100
Time Limit Exceeded

input:

1000 780
456 159
722 862
983 491
946 335
159 379
516 983
330 823
491 335
607 645
910 379
538 872
823 456
518 840
414 456
507 453
910 872
456 461
235 607
340 379
379 20
351 491
946 159
159 722
840 116
823 679
840 594
10 983
910 10
125 594
777 116
760 516
20 840
909 491
516 862
872 838
228 760
517 679...

output:


result: