/* arrgt2.c
 *
 * Recherche de tous les arrangements de p éléments de
 * l'ensemble {1, 2, 3, 4, 5, ..., n}
 * 
 * 01/05/2005 Jean-Paul Davalan <jpdvl@wanadoo.fr>
 *
 * compilation :  gcc -O2 -o arrgt2 arrgt2.c
 * usage : arrgt2  n p
 *
 */
#include <stdio.h>
#include <stdlib.h>
#include <string.h>


void arrangements(int n, int p, int k, int *L, int *t) {
        int i, j, j1, t2[n];

        if(k==p) {
                for(i=0;i<p;i++) printf("%d ",L[i] + 1);
                printf("\n");
                return;
        }
        for(i=0;i<n-k;i++) {
                L[k] = t[i];
                for(j=0, j1=0;j<n-k;j++) {
                        if(j != i) {
                                t2[j1] = t[j];
                                j1++;
                        }
                }
                arrangements(n, p, k+1, L, t2);
        }

}
	
void effectue(int n, int p) {
  int L[p], t[n], i;
  for(i=0;i<n;i++) t[i] = i;
  arrangements(n, p, 0, L, t);
}

int main(int argc, char *argv[]) {
	int n, p;
	if(argc<3) {
		printf("usage : %s n p\n",argv[0]);
		exit(1);
	}
	n = atoi(argv[1]); // lecture des paramètres
	p = atoi(argv[2]);

        if(n<0 || p<0 || p>n) return 0;
	effectue(n, p);

	return 0;
}

