Documente Academic
Documente Profesional
Documente Cultură
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
ș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:
.
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 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:
( )
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
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 Cnk1 Cnk11
Cnk Cnnk
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
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”.
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
∑( )
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
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
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))))
Relații echivalente:
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.
8
Mai multe aplicații se găsesc la adresa: http://en.wikipedia.org/wiki/Catalan_number
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");
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.
ifstream f("comb.in");
ofstream g("comb.out");
11
bool p[NMax];
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;
}
# include <fstream>
# define M 30103
using namespace std;
ifstream f("comb.in");
ofstream g("comb.out");
int N, K;
13
F. Aplicații
14