Cod sursa(job #2501230)

Utilizator gavra_bogdanBogdan Gavra gavra_bogdan Data 29 noiembrie 2019 11:33:31
Problema Economie Scor 90
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.67 kb
#include <fstream>
#include <vector>
#include <algorithm>
using namespace std;

const int nmax=1005;
const int kmax=5e4+5;


vector<int>v;
vector<int>ans;
vector<int>is_obtainable;
vector<int>pas;
int aux[nmax];
bool bad[kmax],yes[kmax];

int main()
{
    ifstream cin("economie.in");
    ofstream cout("economie.out");
    ios_base::sync_with_stdio(false);
    cin.tie(0);
    cout.tie(0);
    int n,valmax=-1;
    cin>>n;
    for(int i=1; i<=n; i++)
        cin>>aux[i];
    sort(aux+1,aux+n+1);
    for(int i=1; i<=n; i++)
        if(!bad[i])
        {
            valmax=max(valmax,aux[i]);
            v.push_back(aux[i]);
            for(int j=i+1; j<=n; j++)
                if(aux[j]%aux[i]==0)
                    bad[j]=true;
        }
    ans.push_back(v[0]);
    for(int i=v[0]; i<=valmax; i+=v[0])
        if(!yes[i])
    {
        yes[i]=true;
        is_obtainable.push_back(i);
    }
    for(int i=1; i<v.size(); i++)
    {
        if(yes[v[i]]==true)
            continue;
        pas.clear();
        ans.push_back(v[i]);
        pas.push_back(v[i]);
        for(int j=v[i];j<=valmax;j+=v[i])
            if(!yes[j])
        {
            yes[j]=true;
            pas.push_back(j);
        }
        for(auto x:is_obtainable)
            for(int j=x+v[i]; j<=valmax; j+=v[i])
                if(!yes[j])
            {
                yes[j]=true;
                pas.push_back(j);
            }
        while(!pas.empty())
        {
            is_obtainable.push_back(pas[pas.size()-1]);
            pas.pop_back();
        }
    }
    cout<<ans.size()<<"\n";
    for(auto x:ans)
        cout<<x<<"\n";
    return 0;
}