/****************************************************************************/
/*  Numeros de Ulam: los primeros numeros de Ulam son el 1 y el 2,          */   
/*  cualquier otro entero positivo es un numero de Ulam si y solo si        */
/*  puede escribirse de una sola manera como suma de numeros de Ulam        */ 
/*  diferentes.                                                             */
/*                                                                          */
/* Jaime Suarez <mcripto@bigfoot.com> 2003                                  */
/* en http://elparaiso.mat.uned.es                                            */
/****************************************************************************/

#include <stdio.h>

main(int argc, char *argv[])
{
	long *ulam;
	int formas;
	long n,i,j,encontrados=2,max;


	/* Leer linea de argumentos */
	if (argc!=2) {
		printf("ulam <n> , escribe los n primeros números de Ulam.\n");
		return 1;
	}
	max=atol(argv[1]);

	/* Reserva memoria para el array */
	ulam=(long *)malloc(max*sizeof(long));
	
	/* Inicializar */
	ulam[0]=1; ulam[1]=2; n=3;
	printf("%8d --> %8d\n",1,1);
	printf("%8d --> %8d\n",2,2);
	
	
	/* Ciclo principal */
	while (encontrados<max) {
		formas=0;
		/* Basta con buscar hasta la mitad de n */
		for (i=0; i<encontrados && 2*ulam[i]<n; i++) 
			for (j=i+1; j<encontrados; j++) {
				if (n == ulam[i]+ulam[j]) formas++;
				if (formas>1) break;
			}
		/* Si solo se escribe de una forma, entonces nos vale */
		if (formas==1) { 
			ulam[encontrados]=n; 
			printf("%8d --> %8d\n",++encontrados,n); 
		}
		n++;
	}

	return;
}