Untitled

 avatar
unknown
plain_text
a year ago
2.3 kB
4
Indexable
#include <bits/stdc++.h>
using namespace std;

vector<int> discover;
vector<vector<int>> adj(1006);
int n;

void add_divisors(int n, map<int, int>& m) {
    int i = 2;
    while (i * i <= n) {
        while (n % i == 0) {
            m[i]++;
            n /= i;
        }
        ++i;
    }
    if (n > 1) m[n]++;
}

int val[1005];
vector<int> par(1005, -1); // Initialisation à -1 pour les parents non définis

void dfs(int node, int p = 0) { // Parent initialisé à -1
    discover.push_back(node);
    par[node] = p;
    for (auto t : adj[node]) {
        if (t == p) continue;
        dfs(t, node);
    }
}

vector<int> mask(1005);

int main() {
    cin >> n;
    for (int i = 0; i < n; ++i) cin >> val[i];
    for (int i = 0; i < n - 1; ++i) {
        int u, v;
        cin >> u >> v;
        u--; v--;  // Convertir en index 0
        adj[u].push_back(v);
        adj[v].push_back(u);
    }
    bool ok=true;
    dfs(0);  // Effectuer un DFS à partir du nœud 0

    map<int, int> m;
    for (int i = 0; i < n; ++i) {
        map<int, int> ps;
        add_divisors(val[i], ps);
        for (auto t : ps) {
            ok=false;
            m[t.first] = max(m[t.first], t.second);
        }
    }
    if (ok)
    {
        cout<<0;
        return 0;
    }
    for (int i = 0; i < n; ++i) {
        int maski = 0;
        int k = 0;
        map<int, int> ps;
        add_divisors(val[i], ps);
        for (auto t : m) {
            if (t.second == ps[t.first]) {
                maski += (1 << k);
            }
            k++;
        }
        mask[i] = maski;
    }

    reverse(discover.begin(), discover.end());

    int output = n;
    vector<vector<int>>dp(n+5,vector<int>(1005,1008));
    int goal = (1 << m.size()) - 1;
    for (int i = 0; i < n; ++i) {
        int node = discover[i];
        dp[node][mask[node]] = 1;
        dp[node][0] = 1;
        for (auto t : adj[node]) {
            if (t == par[node]) continue;
            auto v=dp[node];
            for (int mask = goal;mask>=0;mask--)
            {
                for (int x=goal;x>=0;x--)
                {
                    v[mask|x]=min(v[mask|x],dp[node][mask]+dp[t][x]);
                }
            }
            dp[node]=v;
        }
        output = min(output, dp[node][goal]);
    }

    cout << output ;

    return 0;
}
Editor is loading...
Leave a Comment