Cod sursa(job #236535)

Utilizator DraStiKDragos Oprica DraStiK Data 27 decembrie 2008 21:37:31
Problema Economie Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.19 kb
#include <stdio.h>
int a[1005],sol[1005];
int s[50005];
int n,m;
void solve ()
{
    int i,j,k;
    for (i=1; i<=n; ++i)
        if (!s[a[i]])
        {
            sol[++m]=a[i];
            s[a[i]]=1;
            for (j=a[n]+1; j; --j)
                if (a[j])
				    a[j+a[i]]=1;
		    for (j=1; j<=a[n]+1; ++j)
			     if (a[j])
			         for (k=2*j; k<=a[n]+1; k+=j)
			             a[k]=1;
        }
    printf ("%d\n",m);
    for (i=1; i<=m; ++i)
        printf ("%d\n",sol[i]);
}
int divide (int p,int q)
{
    int st,dr,x;
    st=p;
    dr=q;
    x=a[p];
    while (st<dr)
    {
        while (st<dr && a[dr]>=x)
            --dr;
        a[st]=a[dr];
        while (st<dr && a[st]<=x)
            ++st;
        a[dr]=a[st];
        a[st]=x;
    }
    return st;
}
void qsort (int p, int q)
{
    int m;
    m=divide (p,q);
    if (m-1>p)
        qsort (p,m-1);
    if (m+1<q)
        qsort (m+1,q);
        
}
int main ()
{
    freopen ("economie.in","r",stdin);
    freopen ("economie.out","w",stdout);    
    int i;
    scanf ("%d",&n);
    for (i=1; i<=n; ++i)
        scanf ("%d",&a[i]);
    qsort (1,n);
    solve ();
    return 0;
}