#include <stdio.h>
#include <string.h>
FILE *fin, *fout;
int N; // numarul total al elementelor de combinat
int M; // numarul elementelor din fiecare combinatie
#define MAX_COMB 30 // poate fi definit oricat
FILE *fin, *fout;
int sol[MAX_COMB];
int tot=0;
int main( void )
{
// citeste valorile din fisierul "combinari.in" si
// scrie in fisierul "combinari.out" toate variantele combinarilor
fin = fopen("combinari.in", "r");
fout = fopen("combinari.out", "w");
fscanf(fin, "%d%d", &N, &M);
// printf("N=%d M=%d\n", N, M);
int i, j, k;
if (N<M)
printf("EROARE - numarul total al elementelor N=%d\n e mai mic decat numarul elementelor in varianta M=%d\n", N,M);
else if (M==0)
printf("EROARE - nu sunt elemente de afisat in varianta: M=%d\n", M);
else if (M>MAX_COMB)
printf("EROARE - prea mare numaul elementelor in varianta");
j=1; // indexul urmatorului element sol[] din solutia de afisat
sol[0] = 1; // initializez primul element de afisat din solutia sol[M], elementul de referinta
while ( j>0 )
{
// gasesc valorile pentru urmatoarele elemente din combinatie
i=j;
while ( i<M )
{
sol[i] = sol[i-1] + 1; // atribui valoarea pentru elementul i
i++; // urmatorul element
}
// scriu solutia in fisierul de iesire
for (k=0; k<M; k++)
fprintf (fout, "%d ", sol[k]);
fprintf(fout, "\n");
// afisez solutia si pe ecran
// for (k=0; k<M; k++)
// printf ("%d ", sol[k]);
// printf("\n");
tot++;
// verific de la ultimul element din varianta catre primul, daca este elemntul maxim
// pentru ultimul element, sol[M-1] maxim va fi N, pentru urmatorul (sol[M-2]) va fi N-1 s.a.m.d.
j = M-1;
while (j>=0)
{
if (sol[j] < N - (M-1-j) )
{
// inca nu a ajuns la elementul maxim, deci il incrementez si parasesc bucla while pentru o noua solutie de afisat
sol[j]++; // incrementez solutia (noua valoare) pentru referinta
j++; // elementul j va fi acum indexul solutiei aflate in prima bucla while(i)
break;
}
else
// a ajuns la elementul maxim, deci va trebui testat si elementul anterior
j--;
}
}
printf("\nTOTAL = %d variante\n", tot);
return 0;
}