QOJ.ac

QOJ

ID题目提交者结果用时内存语言文件大小提交时间测评时间
#64953#4229. GCD HarmonySa3tElSefr#TL 97ms39052kbC++202.3kb2022-11-26 00:07:092022-11-26 00:07:11

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-26 00:07:11]
  • 评测
  • 测评结果:TL
  • 用时:97ms
  • 内存:39052kb
  • [2022-11-26 00:07:09]
  • 提交

answer

#pragma GCC optimize("O3")
#pragma GCC optimize ("unroll-loops")
#pragma GCC target("avx,avx2,fma")

#include <bits/stdc++.h>
using namespace std;

#define ll long long
#define ld long double


const int N = 5005 + 9, mod = 998244353;
const ll OO = 1e9;


bool isPrime(int n) {
    for(int i = 2; i * i <= n; i++) {
        if(n % i == 0) {
            return 0;
        }
    }
    return 1;
}

vector<int> v;
set<int> st;

void solve(int idx, int cur) {
    if(cur > 10000) return;
    if(idx == (int) v.size()) {
        if(cur > 1) {
            st.insert(cur);
        }
        return;
    }
    solve(idx + 1, cur);
    solve(idx + 1, cur * v[idx]);
}

vector<int> adj[N], adjTree[N], all;

int dp[5005][1500], val[5005];


int solve(int node, int par, int last) {
    auto &ret = dp[node][last];
    if(ret != -1) return ret;


    ret = 10000;
    for(auto i: adj[last]) {
        int t = 0;
        if(all[i] != val[node]) t = all[i];

        for(auto j: adjTree[node]) {
            if(j != par) {
                t += solve(j, node, i);
                if(t > ret) break;
            }
        }
        ret = min(ret, t);
    }
    return ret;
}


int main() {
    ios_base::sync_with_stdio(0);
    cin.tie(0);

    for(int i = 2; i <= 100; i++) {
        st.insert(i);
        if(isPrime(i)) {
            v.push_back(i);
        }
    }

    // cout << (int) v.size() << '\n';
    solve(0, 1);
    for(auto i: st) all.push_back(i);

    // cout << (int) all.size() << '\n';



    int c = 0;
    for(int i = 0; i < (int) all.size(); i++) {
        adj[i].push_back(i);
        for(int j = i + 1; j < (int) all.size(); j++) {
            if(__gcd(all[i], all[j]) > 1) {
                c += 2;
                adj[i].push_back(j);
                adj[j].push_back(i);
            }
        }
    }


    for(int i = 0; i < (int) all.size(); i++) {
        adj[(int) all.size()].push_back(i);
    }

    int n;
    cin >> n;

    for(int i = 1; i <= n; i++) cin >> val[i];

    for(int i = 1; i < n; i++) {
        int u, v;
        cin >> u >> v;
        adjTree[u].push_back(v);
        adjTree[v].push_back(u);
    }
    memset(dp, -1, sizeof dp);
    cout << solve(1, 0, (int) all.size());



    return 0;
}

详细

Test #1:

score: 100
Accepted
time: 84ms
memory: 39052kb

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: 82ms
memory: 38912kb

input:

3
1
2
3
3 1
2 3

output:

4

result:

ok single line: '4'

Test #3:

score: 0
Accepted
time: 84ms
memory: 38916kb

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: 73ms
memory: 38872kb

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: 97ms
memory: 38844kb

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: