Cod sursa(job #2501214)

Utilizator ardutgamerAndrei Bancila ardutgamer Data 29 noiembrie 2019 11:28:26
Problema Economie Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.75 kb
#include <cstdio>
#include <cmath>
#include <vector>
#include <queue>

using namespace std;

const int NMAX = 1005;
const int VMAX = 50005;

bool c[VMAX];

void ciur(int n)
{
    c[0] = c[1] = 1;
    for(int i = 4 ; i <= n ; i += 2)
        c[i] = 1;
    int lim = (int)sqrt((double)n);
    for(int i = 3 ; i <= lim ; i += 2)
    {
        if(c[i] == 0)
        {
            for(int j = i*i ; j <= n ; j += 2*i)
                c[j] = 1;
        }
    }
}

struct ekon{
int val,nr;
bool operator<(const ekon &other) const{
return nr < other.nr;
}
};

priority_queue<ekon>pq;
int f[VMAX];
int primes[VMAX];
bool ok[NMAX];
int v[NMAX];
vector<int>sol;

void putinPeCal(int n)
{
    int d = 2 , e = 0;
    int lim = (int)sqrt((double)n);
    while(d <= lim && n > 1)
    {
        e = 0;
        while(n % d == 0)
        {
            e++;
            n /= d;
        }
        if(e > 0)
            primes[d]++;
        d++;
    }
}

bool check(int n)
{
    for(int i = 1 ; i <= n ; i++)
        if(!ok[i]) return false;
    return true;
}

void print()
{
    for(int i = 0 ; i < sol.size() ; i++)
        printf("%d ",sol[i]);
    printf("\n\n");
}

int main()
{
    freopen("economie.in","r",stdin);
    freopen("economie.out","w",stdout);
    ciur(VMAX-5);
    int n;
    int cnt = 0;
    scanf("%d",&n);
    for(int i = 1 ; i <= n ; i++)
    {
        scanf("%d",&v[i]);
        f[v[i]]++;
        if(c[v[i]] == 0){
            cnt++;
            sol.push_back(v[i]);
            ok[i] = true;
        }
    }
    if(f[1] > 0)
    {
        printf("1\n1\n");
        return 0;
    }
    for(int i = 0 ; i < cnt ; i++)
    {
        for(int j = 1 ; j <= n ; j++)
            if(v[j] % sol[i] == 0){
                ok[j] = true;
            }
    }
    for(int i = 1 ; i <= n ; i++)
    {
        if(ok[i]) continue;
        putinPeCal(v[i]);
    }
    for(int i = 1 ; i <= 50000 ; i++)
    {
        if(primes[i]==0)
            continue;
        ekon temp;
        temp.val = i;
        temp.nr = primes[i];
        pq.push(temp);
    }
    while(!pq.empty() && !check(n))
    {
        while(pq.top().nr != f[pq.top().val])
        {
            ekon temp = pq.top();
            temp.nr = f[pq.top().val];
            pq.pop();
            pq.push(temp);
        }
        sol.push_back(pq.top().val);
        for(int i = 1 ; i <= n ; i++)
        {
            if(ok[i]) continue;
            if(v[i] % pq.top().val == 0)
            {
                f[pq.top().val]--;
                ok[i] = true;
            }
        }
        pq.pop();
    }
    printf("%d\n",sol.size());
    for(int i = 0 ; i < sol.size() ; i++)
        printf("%d\n",sol[i]);
    return 0;
}