QOJ.ac

QOJ

IDProblemSubmitterResultTimeMemoryLanguageFile sizeSubmit timeJudge time
#182488#4895. Lovely Dogshos_lyric#0 2ms4072kbC++144.4kb2023-09-18 05:04:242024-07-04 02:01:39

Judging History

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

  • [2024-07-04 02:01:39]
  • 评测
  • 测评结果:0
  • 用时:2ms
  • 内存:4072kb
  • [2023-09-18 05:04:24]
  • 提交

answer

#include <cassert>
#include <cmath>
#include <cstdint>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <algorithm>
#include <bitset>
#include <complex>
#include <deque>
#include <functional>
#include <iostream>
#include <limits>
#include <map>
#include <numeric>
#include <queue>
#include <set>
#include <sstream>
#include <string>
#include <unordered_map>
#include <unordered_set>
#include <utility>
#include <vector>

using namespace std;

using Int = long long;

template <class T1, class T2> ostream &operator<<(ostream &os, const pair<T1, T2> &a) { return os << "(" << a.first << ", " << a.second << ")"; };
template <class T> ostream &operator<<(ostream &os, const vector<T> &as) { const int sz = as.size(); os << "["; for (int i = 0; i < sz; ++i) { if (i >= 256) { os << ", ..."; break; } if (i > 0) { os << ", "; } os << as[i]; } return os << "]"; }
template <class T> void pv(T a, T b) { for (T i = a; i != b; ++i) cerr << *i << " "; cerr << endl; }
template <class T> bool chmin(T &t, const T &f) { if (t > f) { t = f; return true; } return false; }
template <class T> bool chmax(T &t, const T &f) { if (t < f) { t = f; return true; } return false; }
#define COLOR(s) ("\x1b[" s "m")


int N, D;
vector<int> A, B;
vector<int> C;

vector<int> lpf;
vector<vector<pair<int, int>>> pess;
vector<int> fs;

vector<vector<int>> diviss;

vector<vector<int>> graph;
vector<Int> ans;

pair<vector<int>, map<int, int>> dfs(int u, int pa) {
  pair<vector<int>, map<int, int>> ret;
  {
    const int c = C[u];
    ret.first.push_back(c);
    if (fs[c]) {
      for (const int divi : diviss[c]) {
        ret.second[divi] += fs[c];
      }
    }
    // f(c^2)
    bool ok = true;
    for (const auto &pe : pess[c]) {
      ok = ok && (2 * pe.second <= D);
    }
    if (ok) {
      ans[u] += 1;
    }
  }
  for (const int v : graph[u]) if (pa != v) {
    auto res = dfs(v, u);
    ans[u] += ans[v];
    if (ret.second.size() < res.second.size()) {
      swap(ret, res);
    }
    for (const int c : res.first) {
      const auto &pes = pess[c];
      const int len = pes.size();
      vector<Int> prods(1 << len);
      prods[0] = 1;
      for (int i = 0; i < len; ++i) {
        const int p = pes[i].first;
        const int e = pes[i].second;
        Int q = 1;
        for (int f = 0; f < D + 1 - e; ++f) {
          q *= p;
          if (chmin<Int>(q, N + 1)) break;
        }
        for (int h = 0; h < 1 << i; ++h) {
          prods[h | 1 << i] = min<Int>(prods[h] * q, N + 1);
        }
      }
      int sum = 0;
      for (int h = 0; h < 1 << len; ++h) if (prods[h] <= N) {
        auto it = ret.second.find(prods[h]);
        if (it != ret.second.end()) {
          sum += (__builtin_parity(h)?-1:+1) * it->second;
        }
      }
      ans[u] += sum * fs[c];
    }
    for (const int c : res.first) {
      ret.first.push_back(c);
      for (const int divi : diviss[c]) {
        ret.second[divi] += fs[c];
      }
    }
  }
  return ret;
}

int main() {
  for (; ~scanf("%d%d", &N, &D); ) {
    A.resize(N - 1);
    B.resize(N - 1);
    for (int i = 0; i < N - 1; ++i) {
      scanf("%d%d", &A[i], &B[i]);
      --A[i];
      --B[i];
    }
    C.resize(N);
    for (int u = 0; u < N; ++u) {
      scanf("%d", &C[u]);
    }
    
    lpf.assign(N + 1, 0);
    for (int n = 2; n <= N; ++n) lpf[n] = n;
    for (int p = 2; p <= N; ++p) if (lpf[p] == p) {
      for (int n = 2 * p; n <= N; n += p) chmin(lpf[n], p);
    }
    pess.assign(N + 1, {});
    fs.assign(N + 1, 0);
    for (int n = 1; n <= N; ++n) {
      fs[n] = 1;
      for (int nn = n; nn > 1; ) {
        const int p = lpf[nn];
        int e = 0;
        do {
          ++e;
          nn /= p;
        } while (nn % p == 0);
        pess[n].emplace_back(p, e);
        fs[n] *= ((e <= D) ? ((e&1)?-1:+1) : 0);
      }
    }
// cerr<<"fs = "<<fs<<endl;
    
    diviss.assign(N + 1, {});
    for (int d = 1; d <= N; ++d) {
      for (int n = d; n <= N; n += d) {
        diviss[n].push_back(d);
      }
    }
    
    graph.assign(N, {});
    for (int i = 0; i < N - 1; ++i) {
      graph[A[i]].push_back(B[i]);
      graph[B[i]].push_back(A[i]);
    }
    ans.assign(N, 0);
    dfs(0, -1);
    for (int u = 0; u < N; ++u) {
      printf("%lld\n", ans[u]);
    }
cerr<<"========"<<endl;
  }
  return 0;
}

Details

Tip: Click on the bar to expand more detailed information

Subtask #1:

score: 0
Checker Judgement Failed

Test #1:

score: 10
Accepted
time: 0ms
memory: 4072kb

input:

20 2
18 8
18 11
13 19
10 8
9 11
4 8
9 15
9 17
2 1
13 18
20 18
1 8
12 17
7 16
5 11
16 15
6 19
14 16
1 3
2 15 5 13 20 6 16 18 9 19 17 7 14 10 11 3 1 12 4 8

output:

16
1
1
1
0
1
0
12
3
1
6
1
3
1
2
1
1
7
1
0

result:

ok 20 tokens

Test #2:

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

input:

500 1
287 459
335 297
303 82
427 202
500 158
257 45
410 274
208 19
172 113
274 379
380 65
234 46
161 441
73 488
473 327
474 481
152 67
78 414
260 20
142 385
494 343
446 72
498 296
111 9
349 372
448 217
282 442
412 144
342 44
282 92
337 128
426 201
104 493
278 298
278 145
363 121
92 305
278 379
166 1...

output:

158
-3
0
0
-1
0
0
0
-1
-1
-2
0
0
1
0
0
0
0
-1
-3
0
0
1
0
1
0
0
0
0
0
1
6
5
0
0
0
0
0
1
0
0
0
-1
2
0
0
0
98
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
1
0
-11
0
0
1
0
0
0
-5
0
0
11
0
0
0
0
-1
0
0
1
0
7
-2
0
31
0
2
14
-3
0
1
0
0
0
0
1
0
0
-2
-3
0
0
-3
0
0
0
0
0
0
0
0
0
-1
0
0
-1
0
1
0
0
0
2
1
0
-3
0
0
0
-1
0
0
0
-...

result:

ok 500 tokens

Test #3:

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

input:

500 1
420 282
9 357
176 82
390 58
280 145
303 106
342 485
300 241
149 18
233 286
499 473
288 22
472 103
271 244
490 273
419 93
26 5
408 243
132 423
75 53
112 390
26 227
413 312
401 320
96 71
479 129
459 373
322 425
465 85
244 117
155 7
44 407
225 351
67 480
370 24
408 60
463 245
270 264
271 82
109 3...

output:

158
0
-1
0
6
0
0
0
0
1
0
0
-1
18
0
0
0
0
0
0
0
1
0
0
0
4
0
0
0
1
1
2
0
0
0
0
0
-3
0
0
0
0
0
0
-1
0
3
-1
0
-3
0
0
0
0
0
-1
-1
0
1
0
0
0
1
0
0
0
0
1
0
0
-1
0
7
0
1
230
2
0
0
-6
0
6
0
-2
-2
0
0
-8
0
0
-1
3
1
0
1
0
0
1
0
-3
1
0
0
0
0
-1
0
0
0
0
0
-2
0
-1
0
1
0
7
0
0
-1
0
0
0
0
0
1
0
0
-3
0
-1
0
0
0
0
0
...

result:

ok 500 tokens

Test #4:

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

input:

500 1
407 7
167 9
444 291
345 93
446 169
305 310
231 378
93 158
93 128
233 75
499 106
93 430
403 132
26 186
305 452
15 238
82 93
146 93
272 11
62 319
301 91
136 28
93 60
478 324
101 248
180 445
253 155
61 456
348 130
137 308
93 63
376 93
202 446
93 401
458 9
226 93
164 93
432 484
265 93
396 218
473 ...

output:

158
-207
0
-12
20
0
0
0
49
0
-34
0
56
-59
-38
-119
0
0
0
103
-48
-46
-64
-11
0
-54
0
65
0
0
0
0
0
0
-41
-7
0
0
0
-54
0
39
0
-155
0
0
-49
0
0
-67
0
0
0
-54
-120
0
0
-55
0
0
-21
115
0
0
0
-206
0
0
-21
0
-48
-27
0
0
-71
0
151
0
2
-41
-58
0
0
0
0
0
-11
0
0
-49
-54
-38
49
-32
0
37
0
0
0
0
-42
0
0
-56
54
...

result:

ok 500 tokens

Test #5:

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

input:

500 1
27 412
370 80
199 200
189 311
29 174
242 428
302 491
64 278
390 342
334 86
145 468
329 308
466 462
85 371
198 182
18 435
338 85
473 105
50 131
312 62
58 417
233 53
38 278
377 365
162 397
293 228
12 211
432 499
218 134
390 130
272 381
336 133
137 356
95 449
290 327
151 232
179 272
201 269
304 3...

output:

158
1
2
0
0
0
0
0
1
0
0
0
0
1
1
0
0
3
0
0
-1
0
0
0
0
0
0
0
0
0
0
0
0
0
2
0
0
0
2
0
-8
0
0
0
0
0
0
0
-1
0
0
0
0
0
1
0
0
0
-1
0
0
0
0
-2
0
-2
-1
-3
0
0
0
2
0
-1
0
0
1
1
0
-1
-4
0
1
0
0
0
0
0
1
0
-3
0
0
0
0
0
0
-2
0
0
0
0
0
0
1
1
1
-1
0
0
0
0
0
-1
0
9
0
-67
0
0
0
0
0
0
-4
-2
0
0
0
0
-2
-1
-1
0
-2
0
0
-...

result:

ok 500 tokens

Test #6:

score: -10
Checker Judgement Failed

input:

500 2
428 7
101 379
176 90
188 28
455 459
196 332
481 438
294 234
222 285
2 448
58 491
132 449
111 413
254 163
9 201
269 393
79 11
182 331
277 265
88 370
233 188
329 294
446 445
136 131
317 453
311 219
437 486
496 310
85 349
421 326
316 490
499 367
404 361
446 411
249 494
462 58
433 60
57 278
45 456...

output:


result:


Subtask #2:

score: 0
Judgement Failed

Test #24:

score: 0
Judgement Failed

input:

2000 1
134 1468
867 1750
351 1220
1690 1888
1685 134
585 282
1142 643
206 271
260 1833
1987 770
1029 1667
322 1371
341 518
601 915
119 893
1933 1502
951 1785
1056 1630
1957 1208
96 55
1508 1212
331 427
505 151
1378 1486
1545 697
1459 629
202 997
180 1917
1638 1177
1244 1896
302 658
1433 1605
1318 19...

output:


result:


Subtask #3:

score: 0
Judgement Failed

Test #45:

score: 0
Judgement Failed

input:

200000 20
117994 12616
53490 106425
103660 50033
132640 78252
58384 19939
69183 10015
39098 165030
179856 130356
65245 57831
18234 83378
4240 154896
177149 102260
4634 180087
132390 19627
98506 60775
1890 120740
87908 21917
41323 192721
181885 96684
69412 139951
9800 38301
59025 29879
186185 81402
1...

output:


result:


Subtask #4:

score: 0
Judgement Failed

Test #50:

score: 0
Judgement Failed

input:

200000 1
1 2
1 3
1 4
1 5
1 6
1 7
1 8
1 9
1 10
1 11
1 12
1 13
1 14
1 15
1 16
1 17
1 18
1 19
1 20
1 21
1 22
1 23
1 24
1 25
1 26
1 27
1 28
1 29
1 30
1 31
1 32
1 33
1 34
1 35
1 36
1 37
1 38
1 39
1 40
1 41
1 42
1 43
1 44
1 45
1 46
1 47
1 48
1 49
1 50
1 51
1 52
1 53
1 54
1 55
1 56
1 57
1 58
1 59
1 60
1 61...

output:


result:


Subtask #5:

score: 0
Judgement Failed

Test #55:

score: 0
Judgement Failed

input:

200000 1
1 2
1 3
1 4
1 5
1 6
1 7
1 8
1 9
1 10
1 11
1 12
1 13
1 14
1 15
1 16
1 17
1 18
1 19
1 20
1 21
1 22
1 23
1 24
1 25
1 26
1 27
1 28
1 29
1 30
1 31
1 32
1 33
1 34
1 35
1 36
1 37
1 38
1 39
1 40
1 41
1 42
1 43
1 44
1 45
1 46
1 47
1 48
1 49
1 50
1 51
1 52
1 53
1 54
1 55
1 56
1 57
1 58
1 59
1 60
1 61...

output:


result:


Subtask #6:

score: 0
Judgement Failed

Test #78:

score: 0
Judgement Failed

input:

50000 1
8097 41839
17674 41774
40520 8024
5786 38261
20664 43471
1217 49276
11185 40807
14186 25584
31704 14814
42333 41475
13053 39565
45938 30104
5826 39463
5031 10814
43784 6042
58 33849
42978 18978
36307 33276
34769 4351
27884 37532
27528 29431
29451 39345
10946 9667
19016 47269
7911 30103
10308...

output:


result:


Subtask #7:

score: 0
Judgement Failed

Test #103:

score: 0
Judgement Failed

input:

200000 1
118863 188865
188022 168616
118976 119404
178852 33449
81624 40431
151228 160976
68943 136313
57200 117631
147789 139875
100240 55537
164811 145415
103548 186750
15010 168029
155731 107005
69836 1502
86171 122700
83448 131948
189162 94464
128210 2509
49724 183329
174782 192641
27687 71315
1...

output:


result: