Aranjamentele reprezintă numărul tuturor submulțimilor ordonate de elemente ale unei mulțimi cu elemente.

Aranjamentele sunt practic combinări în care ținem cont de ordine. De exemplu adică și sunt distincte, spre deosebire de combinări unde adică mulțimea . Așa că după cum reiese și din nume a aranjamentele sunt mulțimi aranjate, sau ordonate, și pentru că ținem cont de această ordine aproape întotdeauna , excepția fiind când , atunci .

Deși folosirea permutărilor este cea mai evidenta varianta nu este și cea mai eficientă, și poate pune probleme in stocarea numerelor foarte mari in C++ (de exemplu in cazul de , unde pentru a face împărțirea factorialelor se va calcula , chiar daca se ulterior la , și rezultă 100), așa ca este mai ușor sa facem produsul tuturor numerelor de la la , după cum reiese din simplificarea factorialelor din fracție.

Numărul de aranjamente

Varianta iterativă:

int aranjamente(int n, int k){
	int prod = 1;
	for(int i=n-k+1; i<=n; i++)
		prod*=i;
	return prod;
}

Varianta recursivă:

int aranjamente(int n, int k){
	if(k==0)
		return 1;
	return (n-k+1) * aranjamente(n, k-1);
}

Generarea aranjamentelor

Acest algoritm generează toate , și are o complexitate aproximativă de . La fel ca în cazul algoritmului de generararea permutărilor, se folosește un vector P[ ] pentru a verifica dacă un element a fost deja folosit, singura diferență fiind condiția de oprire care este atunci când pas ajunge la k:

int n, k, P[21], x[21];
 
void afis()
{
    for (int i = 1; i <= k; ++i)
        cout << x[i] << ' ';
    cout << "\n";
}
 
void back(int pas)
{
    for (int i = 1; i <= n; ++i)
        if (!P[i])
        {
            P[i] = 1;
            x[pas] = i;
            if (pas == k)
                afis();
            else
                back(pas + 1);
            P[i] = 0;
        }
}
 
int main()
{
    cin >> n >> k;
    back(1);
}

Alte formule și explicații matematice