Cod sursa(job #188048)

Utilizator toni2007Pripoae Teodor Anton toni2007 Data 6 mai 2008 13:23:30
Problema Economie Scor 0
Compilator c Status done
Runda Arhiva de probleme Marime 1.29 kb
#include <stdio.h>
#include <stdlib.h>
#define N 1010
#define MAX 50010
int n;
int v[N];
int valid[MAX];
int best[N],nr;
void scan(){
     int i;
     freopen("economie.in","r",stdin);
     freopen("economie.out","w",stdout);
     scanf("%d",&n);
     for (i=1;i<=n;++i)
         scanf("%d",&v[i]);
}
void swap(int i,int j){
     int aux;
     aux=v[i];
     v[i]=v[j];
     v[j]=aux;
}
void down_heap(int i,int n){
     int max=i;
     if (2*i<=n && v[max]<v[2*i])
        max=2*i;
     if (2*i+1<=n && v[max]<v[2*i+1])
        max=2*i+1;
     if (i!=max){
        swap(i,max);
        down_heap(max,n);
     }
}     
void sort(){
     int i;
     for (i=n/2;i>=1;--i)
         down_heap(i,n);
     for (i=n;i>1;--i){
         swap(1,i);
         down_heap(1,i-1);
     }
}
void solve(){
     int i,j;
     nr=1;
     best[nr]=v[1];
     for (i=v[1];i<=MAX;i+=v[1])
         valid[i]=1;
     for (i=2;i<=n;++i){
         if (valid[v[i]]==0){
            best[++nr]=v[i];
            for (j=v[i];j<=MAX;j+=v[i])
                valid[j]=1;
         }
     }
}
void print(){
     int i;
     printf("%d\n",nr);
     for (i=1;i<=nr;++i)
         printf("%d\n",best[i]);
     exit(0);
}
int main(){
    scan();
    sort();
    solve();
    print();
}