#include <stdio.h>
#include <stdlib.h>

int *Init (int k);
void Foo (int *nums1, int *nums2, int max, int k1, int k2);

int main (int argc, char *argv[]) {
  int *nums, *nums2;
  int k;

  if ( argc != 2 ) {
    fprintf (stderr, "Usage:  a.out <NUM>\n");
    exit (-1);
  }

  k = atoi (argv[1]);
  nums = Init (k);
  nums2 = (int *) malloc (k * sizeof(int));

  Foo (nums, nums2, k, 0, 0);

  return (0);
}

int *Init (int k) {
  int i;
  int *nums;

  nums = (int *) malloc (k * sizeof(int));
  for ( i=0 ; i < k ; i++ ) {
    nums[i] = i+1;
  }
  return (nums);
}

void Foo (int *nums1, int *nums2, int max, int k1, int k2) {
  int i;

  /* base case */
  if ( k1 == max ) {
    if ( k2 ) {
      for ( i=0 ; i < k2 ; i++ ) {
	printf ("%d ", nums2[i]);
      }
      printf ("\n");
    }
  } else {  /* general rule */
    Foo (nums1, nums2, max, k1+1, k2);
    nums2[k2] = nums1[k1];
    Foo (nums1, nums2, max, k1+1, k2 + 1);
  }
}

