QOJ.ac
QOJ
ID | Problem | Submitter | Result | Time | Memory | Language | File size | Submit time | Judge time |
---|---|---|---|---|---|---|---|---|---|
#414978 | #4229. GCD Harmony | ivan_len# | WA | 8ms | 3956kb | C++20 | 2.6kb | 2024-05-20 06:25:02 | 2024-05-20 06:25:03 |
Judging History
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'