#include <stdlib.h>
#include <stdio.h>
// But :
// Lister tous les arrangements de bits de longueur N contenant U
// fois le digit 1 par ordre décroissant.
/*
Exemple :
en entrée ...
4 2
en sortie ...
1100
1010
1001
0110
0101
0011
*/
int N, U;
// Fonction récursive
void Etendre(char * tab, int nb0, int nb1){
int i;
int size = nb0 + nb1;
if(size == N){
// La chaine est pleine
if(nb1 == U){ // Sureté, seulement si le nombre répond aux critères
for(i=0; i<N; i++) putchar(tab[i]);
putchar('\n');
}
return;
}
// Si on peut encore caser des uns, on copie le tableau arrivant et on le complète avec un 1
if(nb1<U){
char * t1 = malloc((size+1)*sizeof(char));
strcpy (t1,tab,size);
t1[nb0+nb1+1] = '1';
Etendre(t1, nb0, nb1+1);
}
// On copie le tableau arrivant dans t0 et on le complète avec un zero
// (uniquement s'il le nombre de zero finale n'a pas été atteint)
if(nb0<N-U){
char * t0 = malloc((size+1)*sizeof(char));
strcpy (t0,tab,size);
t0[nb0+nb1+1] = '0';
Etendre(t0, nb0+1, nb1);
}
}
void arrangements (int N, int U){
// On lance la récursion avec un tableau vide
Etendre(NULL, 0, 0);
}
int main (void)
{
scanf ("%d%d", &N, &U);
arrangements (N, U);
return 0;
}