QOJ.ac
QOJ
ID | Problem | Submitter | Result | Time | Memory | Language | File size | Submit time | Judge time |
---|---|---|---|---|---|---|---|---|---|
#64939 | #4229. GCD Harmony | Three_Sannin# | TL | 388ms | 1568504kb | C++ | 2.6kb | 2022-11-25 22:07:08 | 2022-11-25 22:07:12 |
Judging History
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;
}
Details
Tip: Click on the bar to expand more detailed information
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...