QOJ.ac
QOJ
ID | Problem | Submitter | Result | Time | Memory | Language | File size | Submit time | Judge time |
---|---|---|---|---|---|---|---|---|---|
#625082 | #4229. GCD Harmony | NYCU_CartesianTree# | WA | 1ms | 3660kb | C++20 | 2.3kb | 2024-10-09 17:23:28 | 2024-10-09 17:23:29 |
Judging History
answer
//============================================================================
// Name : E.cpp
// Author :
// Version :
// Copyright : Your copyright notice
// Description : Hello World in C++, Ansi-style
//============================================================================
#include <bits/stdc++.h>
using namespace std;
const int N = 5005, V = 100;
int min_div[10005];
vector<pair<int, vector<int> > > can_use;
vector<int> point_div[N];
int a[N];
vector<int> prime;
vector<int> graph[N];
int dp[N][105];
int dfs(int x, int fa = 0){
for(auto i : graph[x]){
if(i == fa)
continue;
dfs(i, x);
}
int ans = 1e9;
for(int i = 0; i < can_use.size(); i++){
int val = can_use[i].first;
vector<int> ÷r = can_use[i].second;
int sum = 0;
if(point_div[x] != divider){
sum = val;
}
for(auto j : graph[x]){
if(j == fa)
continue;
int minn = 1e9;
for(auto k : prime){
if(val % k == 0){
minn = min(minn, dp[j][k]);
}
}
sum += minn;
}
for(auto j : divider){
dp[x][j] = min(dp[x][j], sum);
}
ans = min(ans, sum);
}
return ans;
}
int main() {
for(int i = 2; i <= 100; i++){
if(!min_div[i]){
min_div[i] = 1;
prime.push_back(i);
for(int j = i * i; j <= 10000; j += i){
if(min_div[j] == 0){
min_div[j] = i;
}
min_div[j] = min(min_div[j], i);
}
}
}
for(int i = 1; i <= 10000; i++){
map<int, int> cnt;
int x = i;
while(min_div[x] > 1){
cnt[min_div[i]]++;
x /= min_div[i];
}
if(x > 100){
continue;
}
cnt[x]++;
bool can = 1;
for(auto j : cnt){
if(j.second > 1){
can = 0;
break;
}
}
if(can){
can_use.push_back({i, vector<int>()});
vector<int> ÷r = can_use[(int)can_use.size() - 1].second;
for(auto i : cnt){
divider.push_back(i.first);
}
}
}
int n;
cin >> n;
for(int i = 1; i <= n; i++){
for(auto j : prime){
dp[i][j] = 1e9;
}
}
for(int i = 1; i <= n; i++){
cin >> a[i];
for(auto j : prime){
if(a[i] % j == 0){
point_div[i].push_back(j);
}
}
}
int u, v;
for(int i = 0; i < n - 1; i++){
cin >> u >> v;
graph[u].push_back(v);
graph[v].push_back(u);
}
cout << dfs(1) << '\n';
return 0;
}
Details
Tip: Click on the bar to expand more detailed information
Test #1:
score: 0
Wrong Answer
time: 1ms
memory: 3660kb
input:
6 5 6 3 4 9 12 1 2 1 3 1 4 1 6 3 5
output:
-294967295
result:
wrong answer 1st lines differ - expected: '6', found: '-294967295'