Sunteți pe pagina 1din 14

Pregătirea lotului de informatică – juniori

Tulcea – aprilie 2018

Elemente de combinatorică cu aplicații în informatică

Prof. Eugen Nodea


Prof. Cheșcă Ciprian

Cuprins:
A. Permutări. Aranjamente. Combinări
B. Aranjamente geometrice - Triunghiul lui Pascal
C. Șirul lui Catalan
D. Elemente de aritmetică modulară
E. Implementări sugerate
F. Aplicații

A. Permutări. Aranjamente. Combinări


Fie | | și | | și o funcție , unde și sunt mulțimi finite, astfel încât
și , .
Acestei funcții i se pune in corespondență o aranjare a mulțimii de obiecte în mulțimea de căsuțe,
astfel încât în căsuța să intre obiectele din mulțimea | .

Propoziție 1: Numărul funcțiilor este egal cu , unde | | și | | .

Propoziție 2: Numărul funcțiilor injective , notat cu , este egal cu


, unde | | și | | .

și reprezintă numărul de aranjări a obiecte în căsuțe ordonate. fiecare căsuță poate conține oricâte
obiecte din , dar schimbând ordinea obiectelor într-o căsuță rezultă aranjări diferite.
Dacă în definiţia aranjamentelor renunţăm la restricţia ca cele obiecte să fie distincte obţinem un
aranjament cu repetiţie de obiecte luate câte . În acest caz nu este necesar să presupunem .

Exemplu: Fie .
Aranjamentele de obiecte ale lui în căsuțe sunt:
.
Fie Aranjamentele cu repetiţie ce se pot forma cu aceste trei obiecte luate câte două sunt:
.

Propoziție 3: Numărul funcțiilor bijective , notat cu , este egal cu


, unde | | | | .
(factorial)
și reprezintă numărul de permutări a obiecte în căsuțe ordonate.

Se numește permutare de grad funcția bijectivă și se scrie sub următoarea formă:


( )
Se notează cu mulțimea permutărilor de gradul și evident .
Exemplu: Fie mulțimea , .
Permutările de obiecte ale lui sunt:

1
Observație: corespondența ”funcție – cuvinte”
Vom lua în considerare cuvinte de lungime formate din simboluri ale alfabetului
.
Oricărei funcţii îi putem pune în corespondenta cuvântul
în care ordinea literelor contează.
Invers, cuvântului îi putem asocia funcția

Vom nota:
| |

Propoziție 4: Numărul de cuvinte crescătoare de lungime folosind simboluri este egal cu


(combinări cu repetiție)

Propoziție 5: Numărul de cuvinte strict crescătoare de lungime folosind simboluri este egal cu
(combinări)

Exemplu: ,| | ;
Combinările de obiecte ale lui în căsuțe sunt:
.
Fie Combinările cu repetiţie ce se pot forma cu aceste trei obiecte luate câte două sunt:

Formule și noțiuni derivate


1. Permutări
 Se numește permutarea identică a mulțimii , permutarea pentru care

( )
 Se numește punct fix al unei permutări un număr pentru care avem
. Evident permutarea identică are puncte fixe
 Numărul de permutări de elemente fără puncte fixe, notat cu este

Se poate demonstra ușor că:

 Numărul de permutări a unei mulțimi de obiecte cu puncte fixe este

 Se numește inversiune a unei permutări o pereche cu și .


 O permutare a mulțimii poate avea cel mult inversiuni

2. Aranjamente


 Ank  (n  k  1) Ank 1, unde k  2.
 Numărul de aranjări ale unei mulțimi de obiecte în căsuțele
astfef încât în sa avem obiecte, în obiecte, …, în sa avem obiecte, unde
, este

2
Altfel spus, cele elemente de tip se pot plasa în Cnn1 moduri pe cele poziții ale permutării,
n
cele elemente de tip se pot plasa în Cn 2 n1 moduri pe pozițiile rămase, ..., cele obiecte de tip
n
se pot plasa în Cn k n1 ... nk 1 moduri.
 Numărul de aranjamente cu repetiție este
~
Anm  n m
 Avem un număr infinit de obiecte de tipurile .. În câte moduri putem așeza obiectele
pe n poziții?
~
Ank

3. Combinări

~ ~
Dacă notăm cu Cn numărul combinărilor cu repetiție, atunci există relația: Cn  Cm  n 1
m m m

 Cnk  Cnk1  Cnk11

 Cnk  Cnnk
 Cn0  Cn1  ...  Cnn  2n
 Avem un număr infinit de obiecte de tipurile . Numărul de moduri în care putem
k 1
alege n obiecte dintre aceste este : C n k 1 C n
n k 1

 Binomul lui Newton:


a  bn  Cn0a n  Cn1a n 1b  Cn2a n  2b2  ...  Cnn 1abn 1  Cnnbn
Membrul drept al relației se numește dezvoltarea binomului a  b  .
n

Termenii din dezvoltare au forma generala: Tk 1  Cnk a nk bk

3
B. Aranjamente geometrice - Triunghiul lui Pascal
Triunghiul lui Pascal este un aranjament geometric al coeficienților binomiali, numit astfel în onoarea
matematicianului francez Blaise Pascal.

1 1
1 1
1 2 1
1 3 3 1
1 4 6 4 1
1 5 10 10 5 1

Orice număr din interiorul triunghiului lui Pascal este situat pe un anumit rând orizontal, sau pe o
anumită “bază”. Un număr oarecare de pe baza (n) se calculează “mergând înapoi” folosind relația de
recurență:

Există şi alte moduri de a aborda numerele din triunghiul lui Pascal, numere ce joacă un rol important
în foarte multe probleme interesante şi se bucură de foarte multe proprietăţi interesante.

“Acest tabel de numere are proprietăţi eminente şi admirabile” spunea Jaques Bernoulli, “în el stă
esenţa combinatoricii, iar cei familiarizaţi cu geometria ştiu că în el sunt ascunse secrete capitale din toată
matematica”.

Proprietăți ale triunghiului lui Pascal


Relații pe rânduri

1. Triunghiul este simetric

2. Suma elementelor unui rând este egală cu dublu sumei rândului precedent și reprezintă puteri ale
lui 2. Altfel spus, suma rândului n este egală cu 2n.

4
3. Dacă considerăm fiecare rând a fi un singur număr, atunci acesta va reprezenta puterile lui 11. De la
rândul al cincilea încolo, unde vom avea numere formate din mai multe cifre, vom aduna numărul
de pe poziţia precedentă cu prima cifră a numărului şi tot aşa până când acestea se termină.

4. Suma pătratelor rândului este egală cu elementul din mijloc al rândului , altfel spus

∑( )

Rândul 3: 12 + 32 + 32 + 12 = 1 +9 + 9 + 1 = 20. Elementul din mijloc al rândului 3 x 2 = 6 este 20.


Rândul 4: 12 + 42 + 62 + 42 + 12 = 1 + 16 + 36 + 16 + 1 = 70. Elementul din mijloc al rândului 4 x 2 = 8 este 70.

5. Dacă ne aflăm pe un rând , număr par, atunci:


, unde

6. Dacă ne aflăm pe un rând număr prim atunci toate numerele ce compun acel rând cu excepția lui
1 sunt divizibile cu acel număr prim.
Exemplu:
Rândul 7: 1 7 21 35 35 21 7 1. Numerele 21 şi 35 sunt divizibile cu 7.
Rândul 11: 1 11 55 165 330 462 462 330 165 55 11 1. Numerele 55, 165, 330 şi 462 sunt divizibile
cu 11.

5
Relații pe diagonale

1. Prima diagonală a triunghiului conţine numai numărul 1. A două diagonală este reprezentată de
numerele naturale pozitive în ordine crescătoare, a treia diagonală conţine numerele triunghiulare,
a patra diagonală conţine numerele tetraedre care sunt date de formula , iar
următoarea diagonală este reprezentată de numerele pentatope, ce sunt date de formula
.

2. Se poate obține seria numerelor șirului Finonacci dacă se însumează pe diagonale ”line”.

1
1 1
1 2 1
1 3 3 1
1 4 6 4 1
1 5 10 10 5 1
1 6 15 20 15 6 1
1 7 21 35 35 21 7 1

3. Formula “triunghiului echilateral”

Această formulă, exprimă un mod de calcul simplu al sumei tuturor elementelor ce se găsesc într-un
triunghi “echilateral” inclus în triunghiul lui Pascal.
Așadar, suma tuturor elementelor unui triunghi echilateral inclus în triunghiul lui Pascal este egală
cu suma dintre elementul situat în vârful triunghiului și suma elementelor ce se găsesc strict sub baza
triunghiul echilateral.
Observații:
 Această formulă are drept consecință reducerea ordinului de
complexitate pentru calculul sumei elementelor unui triunghi
echilateral de la O(l2) la O(l).
 Formula funcționează indiferent unde este poziționat vârful
triunghiului (pe o latură a triunghiului lui Pascal sau în interiorul
acestuia).

6
Triunghiul aranjamentelor

1
1 1
1 2 2
1 3 6 6
1 4 12 24 24
1 5 20 60 120 120

Regula de completare a triunghiului aranjamentelor folosește formula de recurență:


Ank  (n  k  1) Ank 1, unde k  2 ,

7
C. Șirul lui Catalan
Numerele pe care le vom defini în continuare au apărut ca o consecinţă a rezolvării unor probleme
de combinatorică. Numele provine de la matematicianul belgian Eugene Charles Catalan (1814 – 1894).
Acesta le-a obţinut în încercarea de a rezolva o problemă legată de distribuţia parantezelor la
înmulţire, după cum rezultă din tabelul următor:
n=0 (a) 1 mod
n=1 (a · b) 1 mod
n=2 ((a · b) · c), (a · (b · c)) 2 moduri
n=3 (((a · b) · c) · d), ((a · b) · (c · d)), ((a · (b · c)) · d), (a · ((b · c) · d)), 5 moduri
(a · (b · (c · d)))
n=4 ((((a · b) · c) · d) · e), (((a · b) · c) · (d · e)), (((a · b) · (c · d)) · e), 14 moduri
((a · b) · ((c · d) · e)), ((a · b) · (c · (d · e))), (((a · (b · c)) · d) · e),
((a · (b · c)) · (d · e)), ((a · ((b · c) · d)) · e), ((a · (b · (c · d))) · e),
(a · (((b · c) · d) · e)), (a · ((b · c) · (d · e))), (a · ((b · (c · d)) · e)),
(a · (b · ((c · d) · e))), (a · (b · (c · (d · e))))

Definiție: Numerele ,n , se numesc numerele Catalan.

Primele numere din acest şir sunt : 1,1,2,5,14,42,132,429,1430,4862,16796,...

Relații echivalente:


Aplicații ale șirului lui Catalan

1. Numărul de expresii care conțin 2*n paranteze care se închid corect este .
Exemplu: n=3 => ((())),()(()), ()()(),(())(),(()()).
2. Numărul de triangularizări ale unui poligon convex cu n vârfuri, adică împărțirea unui poligon în n
triunghiuri disjuncte , n ≥ 3.

3. Fie n ℕşi numerele naturale x1,x2,...,xn {1,2,...,n}, astfel încât x1≤x2≤…≤xn.


Câte posibilităţi de alegere a acestor numere există astfel încât să fie îndeplinită condiţia:
x1+x2+…+xn 0 (mod n)?
Pentru n = 1 , avem varianta 0. Pentru n = 2 , avem 00 şi 12. Pentru n = 3 avem 000,013,
022,112,233, iar pentru n = 4 obţinem 14 soluţii: 0000,0014,0023,0113,0122,0244,
0334,1112,1144,1234,1333,2224,2233,3444.
Se demonstrează că numărul de soluţii este
4. Numărul de arbori binari cu n noduri este
5. Numărul de drumuri laticiale dintre (0,0) și (n,n) cu pași de forma (1,0) și (0,1) care însă
nu trec deasupra dreptei de ecuație y=x este
Exemplu: n = 4:

8
Mai multe aplicații se găsesc la adresa: http://en.wikipedia.org/wiki/Catalan_number

D. Elemente de aritmetică modulară


Congruența (teoria numerelor):
Fie n un număr natural pozitiv. Spunem că două numere a si b sunt congruente modulo n dacă
(a - b) % n = 0 . Notăm: a ≡ b (mod n)

1. Aritmetica modulară, proprietăți:


a) (a + b) % c = (a % c + b % c) % c
b) (a * b) % c = ((a % c) * (b % c)) % c
c) (a - b) % c = (a % c - b % c) % c
d) (a / b) % c = ((a%c) * (b^(-1)%c))%c, unde b^(-1) este invers modularul lui b și c.
Exemplu:
dacă a = 10^18, b = 10^19 și c = 10^9 + 7 atunci a + b ar depăși 2^64, astfel putem folosi
proprietatea a), adică (a % c + b % c) % c

2. Invers modular:
Ce este?
Să presupunem că trebuie să rezolvăm ecuația: A * B = 1, este simplu că B = 1/A , adică A^-1.
Acum să presupunem că trebuie să rezolvăm ecuația: (A * B) % M = 1, aici B este invers modularul
lui A modulo M și B este din interval [1, M - 1].
Un invers modular(B) exista daca si numai daca gcd(A, M)= 1, adica daca A si M sunt coprime/relativ
prime între ele.

9
E. Implementări sugerate
Generarea permutărilor
 backtracking recursiv
# include <fstream>
using namespace std;

ifstream f("permutari.in");
ofstream g("permutari.out");

int N, st[101], k, ap[101];


void tipar(int k){
for(int i=1; i<=k; ++i)
g << st[i] << ' ';
g << '\n';
}
void back(int k){
int x, ev;
for(x=1; x<=N; ++x){
st[k] = x;
ev = (ap[st[k]] == 0);
if (ev){
ap[st[k]]=1;
if(k == N) tipar(k);
else back(k + 1); ///urcam in stiva
ap[st[k]] = 0;
}
}
}
int main(){
f >> N;
back(1);
return 0;
}

 folosind next_permutation
# include <fstream>
# include <algorithm>
# include <vector>
using namespace std;

ifstream f("permutari.in");
ofstream g("permutari.out");

int n;
vector <int> a;

void tipar(){
for (int i=0; i<n; i++)
g << a[i] << ' ';
g << '\n';
}
int main(){
f >> n;
for (int i=1; i<=n; i++)
a.push_back(i);
do {
tipar();
}while (next_permutation(a.begin(), a.end()));
return 0;
}

10
Generarea triunghiului lui Pascal
 folosind o matrice
void comb(int N){
int i, j;
C[0][0] = C[1][0] = C[1][1] = 1;
for (i=2; i<=N; ++i){
C[i][0] = C[i][i] = 1;
for (j=1; j<i; ++j)
C[i][j] = C[i-1][j-1] + C[i-1][j];
}
}
 folosind doi vectori
void comb(int N){
int i, j;
L0[0] = L0[1] = 1; /// linia 1
for (i=2; i<=N; ++i) {
L[0] = 1;
for (j=1; j<i; ++j)
L[j] = L0[j-1] + L0[j];
L[i] = 1;
for (j=0; j<=i; ++j) /// copiem linia curenta
L0[j] = L[j];
}
}

Calculul combinărilor

Observație:
 În relația de mai sus am simplificat prin k!.
Dacă (n-k)! > k! este preferabilă simplificarea cu (n-k)!
Exemplu: C(7,2)=7! / (2!*5!)
7! = 1*2*3*4*5*6*7 = 2^4 * 3^2 * 5^1 * 7^1
2!*5! = (1*2)*(1*2*3*4*5) = 2^4 * 3^1 * 5*1
Prin simplificare obținem: 3^1 * 7^1 = 21
Descriere algoritm:
- Construim vectorul factoriilor primi <=N (ciurul lui Erathostenes)
- Determinăm puterea la care apare orice factor prim <=N în calculul lui N! (formula lui Lagrange)
Fie p un factor prim. Puterea la care apare factorul prim p în calculul lui N! este egală cu:
, unde pk reprezintă cea mai apropiată putere a lui p de N
Obținem astfel un vector cu exponenții asociat fiecărui factor prim.
Exemplu: N=7 avem:
Factorul prim p 2 3 5 7
Exponent 4 2 1 1
- Împărțim cu K!, respectiv cu (N-k)!. În fapt, procedăm similar ca mai sus, doar că pentru fiecare
factor prim scădem exponentul din descompunerea anterioară (defactorizăm)
- Calculăm valoarea ca fiind produsul : , folosind exponențierea logaritmică, la
care putem aplica operația modulo.

 Calcul combinări prin descompunerea în factori primi


# include <fstream>
# define NMax 10001
using namespace std;

ifstream f("comb.in");
ofstream g("comb.out");

int N, K, nr, sol;


int pr[NMax], e[NMax];

11
bool p[NMax];

int lgput(int a, int b){ /// ridicare la putere – exponentiere logaritmica


int x = 1;
while(b)
if(b%2 == 1)
x *= a, b--;
else
a *= a, b /= 2;
return x;
}
void fact(int x){
int i = 1;
while(x > 1){
while(x % pr[i] == 0)
e[pr[i]]++, x /= pr[i];
++i;
}
}
void defact(int x) // efectuam impartirea, simplificarea exponentilor
{
int i = 1;
while(x > 1) {
while(x % pr[i] == 0)
e[pr[i]]--, x /= pr[i];
i++;
}
}
void Ciur(){
for(int i=2; i<=N; ++i)
if(!p[i]){
pr[++nr] = i;
for(int j=2; i*j<=N; j++)
p[i*j] = 1;
}
}
int main(){
int i;
f >> N >> K;
Ciur();
for(i=K+1; i<=N; ++i)
fact(i);
for(i=2; i<=N-K; ++i)
defact(i);
sol = 1;
for(i=1; i<=nr; ++i)
if(e[pr[i]] > 0)
sol *= lgput(pr[i], e[pr[i]]);
g << sol << "\n";
return 0;
}

Calculul termenului n al șirului lui Catalan


# include <cstdio>
# include <cstring>
# define MOD 30103
using namespace std;

int N, i;
unsigned long long C[15001];

/* Catalan(n) = Catalan(0)*Catalan(n-1) +
Catalan(1)*Catalan(n-2) +
Catalan(2)*Catalan(n-3) +
... +

12
Catalan(n-1)*Catalan(0) */
int catalan(int N){
int i, j;
memset(C, 0, sizeof(C));
C[0] = (unsigned long long) 1;
for (i=1; i<=N; ++i)
for (j=0; j<i; ++j)
C[i] = (C[i] % MOD + (C[j] * C[i-j-1]) % MOD) % MOD;
return C[N];
}

int main() {
scanf("%d", &N);
printf("%d\n", catalan(N));
return 0;
}

 Calcul combinări folosind invers modular

# include <fstream>
# define M 30103
using namespace std;

ifstream f("comb.in");
ofstream g("comb.out");
int N, K;

void GCD (int A, int B, int &X, int &Y){


int X0, Y0;
if (B ==0 ){
X = 1, Y = 0; return;
}
GCD (B, A%B, X0, Y0);
X = Y0;
Y = X0 - Y0 * (A/B);
}
int inversm(int N){
int X, Y;
GCD (N, M, X, Y);
if (X <= 0) X = M + X%M;
return X;
}
int comb(int N, int K){
int A, B, i;
A = B = 1;
for(i=K+1; i<=N; ++i)
A = (A*i) % M;
for(i=1; i<=N-K; ++i)
B = (B*i) % M;
A = (A * inversm(B)) % M;
return A;
}
int main(){
f >> N >> K;
g << comb(N, K);
return 0;
}

13
F. Aplicații

Probleme lot juniori combinatorică


 tripas
 sumall
 ecuatie
 nmult
 pascal
 implementare
 pastile

Probleme interesante combinatorică


 Permutare – pbinfo.ro
 Permutari – varena.ro
 Permutări unice – varena.ro
 Permfix – varena.ro
 Permutari3 – pbinfo.ro
 Pascal – infoarena.ro
 Inversiuni – varena.ro
 Prezenta – infoarena.ro
 Perm – varena.ro
 Sirul – infoarena.ro
 Permutari II – infoarena.ro
 Permutari3 – infoarena.ro
 Perm4 – infoarena
 Stiva1 – campion.edu.ro/arhiva
 Poly2 – infoarena.ro
 Spion – infoarena.ro
 Expozitie – infoarena.ro
 Numere7 – infoarena.ro
 Cifru – infoarena.ro
 Frac – infoarena.ro
 Mins – infoarena.ro

Articole pe această temă


http://www.infoarena.ro/problema/stirling
http://www.infoarena.ro/problema/combinari
http://www.infoarena.ro/problema/inversmodular
http://www.infoarena.ro/problema/lgput
http://www.infoarena.ro/problema/submultimi
http://www.infoarena.ro/problema/pinex
http://c m i n e u r r i r i er er
http://campion.edu.ro/arhiva/www/arhiva_2009/seds/11/index.htm
http://campion.edu.ro/arhiva/www/arhiva_2009/papers/paper22.pdf
http://campion.edu.ro/arhiva/www/arhiva_2009/papers/paper20.pdf
http://campion.edu.ro/arhiva/www/arhiva_2009/papers/paper32.pdf

14

S-ar putea să vă placă și