QOJ.ac

QOJ

ID题目提交者结果用时内存语言文件大小提交时间测评时间
#64939#4229. GCD HarmonyThree_Sannin#TL 388ms1568504kbC++2.6kb2022-11-25 22:07:082022-11-25 22:07:12

Judging History

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

  • [2023-08-10 23:21:45]
  • System Update: QOJ starts to keep a history of the judgings of all the submissions.
  • [2022-11-25 22:07:12]
  • 评测
  • 测评结果:TL
  • 用时:388ms
  • 内存:1568504kb
  • [2022-11-25 22:07:08]
  • 提交

answer

// Hey there.. I love you <3

#include <bits/stdc++.h>
#include <ext/pb_ds/assoc_container.hpp>
#include <ext/pb_ds/tree_policy.hpp>
#include <ext/numeric>

using namespace std;
using namespace __gnu_pbds;

using ll = long long;
using ld = long double;
using L = __int128;
#define int ll

#define fast cin.tie(0), cin.sync_with_stdio(0)
FILE *stream;

#define input(x) freopen_s(&stream, (x), "r", stdin)
#define output(x) freopen_s(&stream, (x), "w", stdout)
#define all(x) x.begin(), x.end()
#define sz(x) ((int)(x).size())
#define maxz(x, y) x = max(x, y)
#define minz(x, y) x = min(x, y)
#define modz(x) x = x % mod + mod, x -= (x >= mod) * mod
#define mp(x, y) make_pair(x, y)
#define f first
#define s second
#define pii pair<int, int>
#define ordered_set(x) tree<x, null_type,less<x>, rb_tree_tag,tree_order_statistics_node_update> //less_equal
mt19937 rnd(time(nullptr));

const int N = 1e4 + 5, M = N * N, mod = 1e9 + 7;
const ld pi = acos(-1), eps = 1e-6;

int prime[N];
vector<int> prdivs[N];
void sieve() {
    for (int i = 2; i < N; ++i) prdivs[0].push_back(i);
    for (int i = 2; i < N; ++i) prime[i] = 1;
    for (int i = 2; i < N; ++i) if (prime[i]) for (int j = 2 * i; j < N; j += i) prime[j] = 0, prdivs[j].push_back(i);
}

int n, p[N], a[N], dp[N][N], done[N][N];
vector<int> e[N];

int solve(int u, int g);

void help(int u) {
    
    memset(done[u], 0, sizeof done[u]);
    
    for (int i = 2; i < N; ++i) {
        done[u][i] = i;
        for (auto v: e[u]) if (v != p[u]) p[v] = u, done[u][i] += solve(v, i);
    }
    
    for (int i = 0; i < N; ++i) if (prime[i]) for (int j = 2 * i; j < N; j += i) minz(done[u][i], done[u][j]);
    done[u][0] = 1e9;
    for (int i = 0; i < N; ++i) for (auto d: prdivs[i]) minz(done[u][i], done[u][d]);
    
    
}

int solve(int u = 0, int g = 0) {
    
    auto &me = dp[u][g];
    if (~me) return me;
    me = 1e9;
    
    if (!~done[u][0]) help(u);
    
    if (gcd(a[u], g) != 1) {
        int sum = 0;
        for (auto v: e[u]) if (v != p[u]) p[v] = u, sum += solve(v, a[u]);
        minz(me, sum);
    }
    
    minz(me, done[u][g]);
    
    return me;
    
}

void hi() {
    
    cin >> n;
    for (int i = 0; i < n; ++i) cin >> a[i];
    for (int i = 0; i < n - 1; ++i) {
        int u, v;
        cin >> u >> v, e[--u].push_back(--v), e[v].push_back(u);
    }
    cout << solve() << endl;
    
}

void init() {
    fast;
    memset(dp, -1, sizeof dp), memset(done, -1, sizeof done);
    sieve();
}

signed main() {
    init();
    
    int T = 1;
    //cin >> T;
    for (int tc = 1; tc <= T; ++tc) hi();
    
    return 0;
}

詳細信息

Test #1:

score: 100
Accepted
time: 256ms
memory: 1568448kb

input:

6
5
6
3
4
9
12
1 2
1 3
1 4
1 6
3 5

output:

6

result:

ok single line: '6'

Test #2:

score: 0
Accepted
time: 264ms
memory: 1568468kb

input:

3
1
2
3
3 1
2 3

output:

4

result:

ok single line: '4'

Test #3:

score: 0
Accepted
time: 308ms
memory: 1568504kb

input:

13
2
5
5
5
5
5
5
3
3
3
3
3
3
1 2
1 3
1 4
1 5
1 6
1 7
1 8
1 9
1 10
1 11
1 12
1 13

output:

15

result:

ok single line: '15'

Test #4:

score: 0
Accepted
time: 196ms
memory: 1568476kb

input:

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

output:

14

result:

ok single line: '14'

Test #5:

score: 0
Accepted
time: 388ms
memory: 1568500kb

input:

8
13
13
13
2
13
13
13
13
1 2
1 3
1 4
1 5
1 6
1 7
1 8

output:

13

result:

ok single line: '13'

Test #6:

score: -100
Time Limit Exceeded

input:

5000
59
25
51
26
33
99
2
13
29
58
5
47
96
83
63
22
69
89
41
90
20
97
85
90
55
17
54
75
54
24
90
54
74
78
81
77
2
47
68
18
60
81
99
86
7
6
76
43
17
43
92
25
36
26
47
100
63
66
2
16
47
25
48
86
24
2
10
42
44
80
92
48
49
21
49
40
32
85
53
88
15
30
4
27
77
16
6
80
50
56
46
14
3
48
92
50
93
35
69
29
48
4...

output:


result: