Cod sursa(job #205457)

Utilizator Astrid28Ruxandra Cohal Astrid28 Data 31 august 2008 22:34:10
Problema Economie Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.32 kb
#include<fstream.h>

int n;
long a[1001],v[1001],val[1001],nr;
ofstream fout("economie.out");

void citire()
{
	ifstream fin("economie.in");
	int i;
	fin>>n;
	for(i=1;i<=n;i++)
		fin>>a[i];
	fin.close();
}



void numara()
{
	int i,ok,j;
	if(a[1]==1)
		{
			fout<<"1"<<'\n';
			fout<<"1"<<'\n';
			fout.close();
		}
	 else
		 {
			 nr=1;
			 val[1]=a[1];
			 v[a[1]]=1;
			 for(i=2*a[1];i<=a[n];i+=a[1])
				 v[i]=1;

			 for(i=2;i<=n;i++)
				 if(!v[a[i]])
					 {
						 val[++nr]=a[i];
						 v[a[i]]=nr;
						 ok=1;
						 for(j=a[1];j<=a[n] && ok;j++)
							 if(v[j] && v[j]<nr)
								{
								 if(j+a[i]<=a[n])
									 v[j+a[i]]=nr;
									else ok=0;
								}
						 for(j=a[i]*2;j<=a[n];j+=a[i])
							 v[j]=nr;
					 }
		 }

}



void afisare()
{
	int i;
	fout<<nr<<'\n';
	for(i=1;i<=nr;i++)
		fout<<val[i]<<'\n';
	fout.close();
}



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 ord(int p, int q)
{
	int mij;
	mij=divide(p,q);
	if(mij-1>p) ord(p,mij-1);
	if(mij+1<q) ord(mij+1,q);
}





int main()
{
	citire();
	ord(1,n);
	numara();
	afisare();
	return 0;
}