QOJ.ac
QOJ
ID | Problem | Submitter | Result | Time | Memory | Language | File size | Submit time | Judge time |
---|---|---|---|---|---|---|---|---|---|
#65218 | #4229. GCD Harmony | Sa3tElSefr | WA | 4ms | 6384kb | C++20 | 2.5kb | 2022-11-28 05:51:22 | 2022-11-28 05:51:23 |
Judging History
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 = 10000 + 5, mod = 998244353;
vector<int> factors[N];
bool vis[N];
bool isPrime(int n) {
for(int i = 2; i * i <= n; i++) {
if(n % i == 0) {
return 0;
}
}
return 1;
}
vector<int> all, primes;
void solve(int idx, int val) {
if(val > 10000) return;
if(idx == (int) primes.size()) {
if(val > 1) all.push_back(val);
return;
}
solve(idx + 1, val);
solve(idx, val * primes[idx]);
}
int n, val[N], dp[5005][N];
vector<int> adj[N];
vector<int> childSorted[N];
void dfs(int node, int par) {
dp[node][1] = 2 * n;
for (int i = 2; i <= 2 * n; i++) {
if (val[node] % i > 0) dp[node][i] = i;
}
for (auto i: adj[node]) {
if (i == par) continue;
dfs(i, node);
memset(vis, 0, sizeof vis);
for (int j = 0; j <= 2 * n; j++) {
childSorted[j].clear();
}
for (int j = 0; j <= 2 * n; j++) {
childSorted[dp[i][j]].push_back(j);
}
for (int j = 0; j <= 2 * n; j++) {
for (auto childVal: childSorted[j]) {
for (auto prime: factors[childVal]) {
if (vis[prime]) continue;
vis[prime] = 1;
for (int k = prime; k <= 2 * n; k += prime) {
dp[node][k] += j;
}
}
}
}
}
for(int i = 1; i <= n; i++) {
dp[node][i] = min(dp[node][i], 2 * n);
}
}
int main() {
ios_base::sync_with_stdio(0);
cin.tie(0);
for(int i = 2; i < 100; i++) {
if(isPrime(i)) {
primes.push_back(i);
}
}
// solve(0, 1);
// cout << (int) all.size();
for(auto i: primes) {
for(int j = i; j < N; j += i) {
factors[j].push_back(i);
}
}
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;
adj[u].push_back(v);
adj[v].push_back(u);
}
dfs(1, 0);
int ans = 2 * n;
for(int i = 1; i <= 2 * n; i++) ans = min(ans, dp[1][i]);
cout << ans;
return 0;
}
Details
Tip: Click on the bar to expand more detailed information
Test #1:
score: 100
Accepted
time: 2ms
memory: 4348kb
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: 2ms
memory: 6360kb
input:
3 1 2 3 3 1 2 3
output:
4
result:
ok single line: '4'
Test #3:
score: -100
Wrong Answer
time: 4ms
memory: 6384kb
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'