#include <stdio.h>

#define MAX 10240

int add( int a, int b ) { return a + b; }
int sub( int a, int b ) { return a - b; }
int mul( int a, int b ) { return a * b; }
int div( int a, int b ) { return a / b; }

int (*func[])(int, int) = { add, sub, mul, div};
char *funcname[] = { "+", "-", "*", "/" };
int funcsize = sizeof(func) / sizeof(func[0]);

show(char *s, int t[], int size, int d)
{
	int i;
	while( d-- ) { printf("\t"); }
	printf("%s", s);
	for( i = 0; i < size; i++) { printf("%d ", t[i]); }
	printf("\n");
}

int work(int t[], int size, int v[], int d)
{
	int i, j, k, l, tmp, count, xc, yc;
	int x[MAX], y[MAX], xv[MAX], yv[MAX];
	unsigned int b, m, s;

	if( size == 1 ) {
		v[0] = t[0];
		return 1;
	}

	show("work: ", t, size, d);

	count = 0;
	for( b = 1; b < (1u << size) - 1u; b++ ) {

		xc = 0;
		yc = 0;
		for( m = 1u, s = 0; s < size; s++) {
			if ( (m << s) & b ) {
				x[xc++] = t[s];
			} else {
				y[yc++] = t[s];
			}
		}

		if( !xc || !yc ) {
			continue;
		}

		xc = work( x, xc, xv, d + 1);
		yc = work( y, yc, yv, d + 1);

		show( "left: ", xv, xc, d + 1);
		show( "right: ", yv, yc, d + 1);

		for( i = 0; i < xc; i++) {
			for( j = 0; j < yc; j++) {
				for( k = 0; k < funcsize; k++) {
					if( func[k] == div && yv[j] == 0 ) {
						continue;
					}

					for( l = 0; l < d + 2; l++) {
						printf("\t");
					}
					tmp = func[k](xv[i], yv[j]);
					printf("%d %s %d = %d\n", xv[i], funcname[k], yv[j], tmp);
					for(l = 0; l < count && v[l] != tmp; l++);
					if( l == count ) {
						v[count++] = tmp;
					}
				}
			}
		}
	}

	return count;
}

main()
{
	int i, s;
	int n[] = { 9, 11, 13, 8};
	int v[MAX];
	s = work(n, sizeof(n) / sizeof(int), v, 0);
	while( --s ) {
		printf("%d\n", v[s]);
	}
}

