QOJ.ac

QOJ

IDProblemSubmitterResultTimeMemoryLanguageFile sizeSubmit timeJudge time
#414978#4229. GCD Harmonyivan_len#WA 8ms3956kbC++202.6kb2024-05-20 06:25:022024-05-20 06:25:03

Judging History

This is the latest submission verdict.

  • [2024-05-20 06:25:03]
  • Judged
  • Verdict: WA
  • Time: 8ms
  • Memory: 3956kb
  • [2024-05-20 06:25:02]
  • Submitted

answer

#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
#define PB push_back
#define MP make_pair
#define A first
#define B second
#define SZ(x) int(x.size())
#define FR(i, a, b) for (int i = (a); i < (b); ++i)
#define FOR(i, n) FR(i, 0, n)
const int M = 1000000007;
mt19937_64 rnd(chrono::steady_clock::now().time_since_epoch().count());

int n;
vector<int> a;
vector<vector<int>> e;
vector<vector<int>> dp;

int main() {
    ios::sync_with_stdio(0);
    cin.tie(0);
    cin >> n;
    a.resize(n);
    FOR(i, n) cin >> a[i];
    e.resize(n);
    FOR(i, n - 1) {
        int u, v;
        cin >> u >> v;
        u--; v--;
        e[u].PB(v);
        e[v].PB(u);
    }
    vector<int> plist(105, 1);
    vector<int> prime;
    FR(i, 2, 101) {
        if (plist[i] == 0) continue;
        prime.PB(i);
        int cur = 2 * i;
        while (cur <= 100) {
            plist[cur] = 0;
            cur += i;
        }
    }
    vector<int> list;
    unordered_map<int, int> back;
    FR(i, 2, 10001) {
        int cur = i;
        for (auto j : prime) {
            while (cur % j == 0) cur /= j;
        }
        if (cur == 1) {
            list.PB(i);
            back[i] = SZ(list) - 1;
        }
    }
    int len = SZ(list);
    dp.resize(n + 5, vector<int>(len + 5));
FOR(i, 5) cerr << i << ' ' << list[i] << '\n';
    function<void(int, int)> dfs = [&](int u, int pre) {
        for (auto v : e[u]) {
            if (v == pre) continue;
            dfs(v, u);
        }
        FOR(i, len) {
            dp[u][i] = (a[u] == list[i]?0:list[i]);
// if (u == 0 && i == 1) cerr << "initial cost is: " << list[i] << '\n';
            for (auto v : e[u]) {
// if (u == 0 && i == 1) {
//     cerr << "child: " << v << "; cost : " << dp[u][i] << '\n';
// }
                if (v == pre) continue;
                int mn = (1 << 20);
                int cur = list[i];
                while (cur <= 10000) {
                    if (back.count(cur)) mn = min(mn, dp[v][back[cur]]);
// if (back.count(cur) && dp[v][back[cur]] == 2 && v == 3 && u == 0 && i == 1) cout << "child 3 output: " << dp[v][back[cur]] << ' ' << back[cur] << ' ' << cur << ' ' << mn << '\n';
                    cur += list[i];
                }
// if (u == 0 && i == 1 && v == 3) cout << mn << '\n';
                dp[u][i] += mn;
            }
        }
    };
    dfs(0, -1);
    int mn = (1 << 20);
    FOR(i, len) {
        mn = min(mn, dp[0][i]);
    }
// FOR(i, n) {
//     FOR(j, 15) {
//         cout << dp[i][j] << ' ';
//     }
//     cout << '\n';
// }
    cout << mn << '\n';
}

Details

Tip: Click on the bar to expand more detailed information

Test #1:

score: 100
Accepted
time: 3ms
memory: 3856kb

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: 3ms
memory: 3956kb

input:

3
1
2
3
3 1
2 3

output:

4

result:

ok single line: '4'

Test #3:

score: -100
Wrong Answer
time: 8ms
memory: 3832kb

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:

21

result:

wrong answer 1st lines differ - expected: '15', found: '21'