Edit this page Backlinks This page is read only. You can view the source, but not change it. Ask your administrator if you think this is wrong. ====== Rezolvare subiecte admitere - varianta 41 ====== ===== Exercitiul 1===== Numim graf complementar al unui graf neorientat $math[G] graful neorientat $math[G_1] cu aceeasi multime a nodurilor ca si $math[G] si cu proprietatea ca doua noduri sunt adiacente in $math[G_1] daca si numai daca nu sunt adiacente in $math[G]. Daca $math[G] are $math[n] noduri si $math[m] muchii, cate muchii are $math[G_1]. **a)** exact ''n(n-1)/2-m'' **b)** exact ''n-m'' **c)** exact ''(n-1)/2'' **d)** minimum ''n(n-1)/2-m'' **e)** minimum ''n-m'' **f)** maximum ''n(n-1)/2-m'' ==== Solutie ==== Explicatii: ce este un graf **neorientat**, **complementar**, **complet** la ce se refera **adiacenta**. Rezolvare: Intr-un graf complet se gasesc ''n(n-1)'' muchii **orientate**, cu conditia ca o muchie sa nu poata avea acelasi nod ca sursa/destinatie. Asadar avem ''n(n-1)/2'' muchii neorientate. Daca in $math[G] se gasesc $math[m] muchii, atunci in $math[G_1] se vor gasi $math[\frac{n(n-1)}{2}-m] muchii. ===== Exercitiul 2===== Cu ce expresie trebuie completata secventa lipsa (marcata prin ''...'') din functia urmatoare, pentru ca ''f(x,2)'' sa aiba ca rezultat suma exponentilor factorilor primi ce intra in descompunerea lui ''x''? <code C> int f(int x, int d){ if(...) return 1; if(x%d==0) return 1+f(x/d,d); return f(x, d+1); } </code> **a)** ''x==1'' **b)** ''x==0'' **c)** ''x<d/2'' **d)** ''x<d'' **e)** ''x>d'' **f)** ''x<%%=%%d'' ==== Solutie ==== Context: numerele prime compun toate numerele naturale (comparatie cu tabelul lui Mendeleev). Factorii primi sunt acele numere prime care compun un numar. Iar exponentii sunt puterile la care acesti factori se afla. Gauss, a demonstrat in aprox. 1800, ca fiecare numar natural are o descompunere unica in factori primi. Programul de mai sus, testeaza divizibilitatea lui ''x'' cu fiecare numar natural ''d'', incepand cu 2. Daca ''x'' se divide cu ''d'', procesul se reia cu ''x/d'' si ''d''. Cateva observatii: * daca un numar ''x'' (e.g. 12) se divide cu un ''d=k*n'' (e.g. ''6''), atunci el se divide cu ''2'', iar acest divizor va fi gasit inaintea lui ''6''. De aceea este corect sa incrementam cu ''1'' pe ''d'', fara a fi nevoie sa luam in considerare doar numerele prime * daca un numar ''x'' (e.g. 9) se divide de mai multe ori cu un ''d'', atunci apelul ''1+f(x/d,d)'' va contoriza in mod corect de cate ori se divide ''x'' cu ''d''. Acesta este **exponentul** mentionat in intrebare. Se observa ca dupa ce am //eliminat// din ''x'' pe divizorul sau ''d'', putem continua cu un divizor mai mare (nu este necesar sa reluam cautarea de la ''d=2''). Algoritmul descris mai sus, poate fi implementat in doua feluri: <code C> int f(int x, int d){ if(x==1) return 0; if(x%d==0) return 1+f(x/d,d); return f(x, d+1); } </code> In acest caz, cand ''x==1'', numarul a fost deja descompus si toti exponentii au fost contorizati. sau: <code C> int f(int x, int d){ if(x==d) return 1; if(x%d==0) return 1+f(x/d,d); return f(x, d+1); } </code> In acest caz, cand ''x==d'' inseamna ca am intalnit ultima **aparitie** a lui ''d'' ca divizor a lui ''x'' (garantat sa existe si sa fie gasit de procedura de mai sus). Singurul raspuns cu care programul de mai sus s-ar comporta la fel este ''x<=d''