Sari la conținut

Bac informatică 2026 Model, rezolvat

Modelul de la Bacalaureatul la Informatică (Mate-Info, C/C++): conține 3 subiecte (90 de puncte) și are un timp de lucru de 3 ore. Sub fiecare exercițiu găsești răspunsul corect și rezolvarea.

Subiecte oficiale publicate de Ministerul Educației. Rezolvări realizate de subac. Actualizat la .

📌 Despre Modelul din 2026

Modelul din 2026 trece prin împărțirea întreagă, recursivitate, backtracking, structuri, grafuri și arbori, cmmdc, șiruri de caractere, cifre, matrice și o problemă de eficiență cu factoriale. Este un test complet, bun ca să vezi cum arată un subiect de Bac de la cap la coadă.

Subiectul I (20p): 5 grile: valoarea expresiei 20/25*20/2, un subprogram recursiv care împarte un tablou în două jumătăți, o problemă de backtracking cu seturi de jocuri, numărul de locuitori calculat din câmpurile unei structuri zona și muchiile care lipsesc dintr-un graf, știind un lanț elementar de lungime maximă.

Subiectul al II-lea (40p): Un algoritm în pseudocod care caută, coborând de la n, primul număr care nu e prim cu m, rădăcinile pentru care nodul 8 are doi „frați” și o secvență care transformă un număr de telefon din format internațional în format local.

Subiectul al III-lea (30p): Un subprogram cu cifre (Plus, care înlocuiește fiecare secvență 25 cu 26), o problemă cu o matrice din care se elimină diagonala secundară și o problemă de eficiență care află cea mai mare putere a lui 26 care divide 1·2·...·n și o scrie în fișierul bac.txt.

⚠️ La ce să fii atent

  • La I.1: 20/25 este o împărțire între numere întregi și dă 0, iar operațiile se fac de la stânga la dreapta. Tot ce urmează înmulțește sau împarte un 0, deci rezultatul este 0.
  • La I.5: Muchia [4,5] lipsește din cele date, dar apare în lanț. La varianta a), muchia [1,6] ar prelungi lanțul cu nodul 6, deci lanțul dat n-ar mai avea lungime maximă.
  • La II.1.a: Al doilea repetă calculează cmmdc prin scăderi. Se afișează n+1, pentru că n a fost micșorat înainte de verificare: pentru 27 și 38 se obține 36.
  • La III.1: Fii atent la zerourile de la finalul numărului! Ele trebuie să rămână la locul lor: din 202535250 obții 202635260.
  • La III.3: 26 = 2·13, iar în produs factorul 2 apare mai des decât 13, deci numeri doar factorii 13: [n/13] + [n/13²] + .... Puterea lui 13 poate depăși tipul int la ultimul pas, așa că folosește long long.

Subiectul I

20 de puncte
  1. Exercițiul 1 4p Expresii și operatori

    Indicați valoarea expresiei C/C++ alăturate.

    20/25*20/2
    • a)0
    • b)0.02
    • c)0.08
    • d)8
    Vezi rezolvarea

    Răspuns corect: a) 0

    / și * au aceeași prioritate și se aplică de la stânga la dreapta. 20/25 este o împărțire între numere întregi, deci dă câtul, 0. Apoi 0*20 este 0, iar 0/2 este tot 0.

    b) și c) ar presupune o împărțire cu zecimale, iar d) o altă ordine a operațiilor.

  2. Exercițiul 2 4p Recursivitate

    Subprogramul f este definit alăturat.

    Știind că variabila x memorează un tablou unidimensional cu elementele (2,0,2,6,8), în această ordine, numerotate de la 0 la 4, indicați valoarea f(0,4,x).

    int f(int s,int d,int v[])
    { if(s==d) if(v[d]==2*d)return 1;
                 else return 0;
      else return f(s,(s+d)/2,v) + f(1+(s+d)/2,d,v);
    }
    • a)1
    • b)2
    • c)4
    • d)5
    Vezi rezolvarea

    Răspuns corect: b) 2

    Funcția împarte intervalul de poziții în două jumătăți până ajunge la câte o singură poziție d și numără pozițiile pentru care v[d]==2*d.

    Pentru (2,0,2,6,8): v[0]=2≠0, v[1]=0≠2, v[2]=2≠4, v[3]=6=6, v[4]=8=8. Două poziții îndeplinesc condiția, deci f(0,4,x) = 2.

  3. Exercițiul 3 4p Backtracking

    La un târg pentru copii, fiecare joc este asociat cu câte o singură abilitate – cheie, dintre cele pe care le poate dezvolta. Utilizând metoda backtracking, se generează toate posibilitățile de a expune seturi de câte trei jocuri din mulțimea {jenga (motricitate), kendama (motricitate), lego (creativitate), șah (strategie), scrabble (vocabular)}, astfel încât să nu fie alese simultan două jocuri care dezvoltă aceeași abilitate - cheie, scrabble să NU apară pe prima poziție, iar șahul să NU fie înainte de jenga sau kendama. Două seturi sunt distincte dacă diferă prin cel puțin un joc sau dacă ordinea jocurilor este diferită. Primele cinci seturi generate sunt, în această ordine:

    1. (jenga, lego, șah)
    2. (jenga, lego, scrabble)
    3. (jenga, șah, lego)
    4. (jenga, șah, scrabble)
    5. (jenga, scrabble, lego)

    Indicați penultimul set generat.

    • a)șah, lego, scrabble
    • b)șah, scrabble, lego
    • c)lego, jenga, șah
    • d)lego, șah, jenga
    Vezi rezolvarea

    Răspuns corect: a) șah, lego, scrabble

    Seturile se generează în ordinea din mulțime: jenga, kendama, lego, șah, scrabble, deci ultimele sunt cele care încep cu cel mai târziu joc permis pe prima poziție. scrabble nu poate fi primul, așa că ultimele seturi încep cu șah.

    Dacă șah este primul, jenga și kendama nu mai pot apărea după el, deci celelalte două jocuri sunt lego și scrabble: întâi (șah, lego, scrabble), apoi (șah, scrabble, lego), ultimul set. Penultimul este (șah, lego, scrabble).

  4. Exercițiul 4 4p Tipul înregistrare (struct)

    Variabila z, declarată alăturat, memorează unele date despre 100 dintre zonele continentului.

    Știind că densitatea unei zone este egală cu raportul dintre numărul de locuitori și suprafața acesteia (exprimată în km^2), indicați o expresie a cărei valoare este egală cu numărul de locuitori ai primei zone.

    struct zona
    { char nume[21];
      int densitate;
      int suprafata;
    }z[100];
    • a)z[0].densitate*z[0].suprafata
    • b)z.densitate[0]*z.suprafata[0]
    • c)densitate[0].z*suprafata[0].z
    • d)densitate.z[0]*suprafata.z[0]
    Vezi rezolvarea

    Răspuns corect: a) z[0].densitate*z[0].suprafata

    z este un tablou de structuri, deci prima zonă este z[0], iar câmpurile ei se accesează cu punct: z[0].densitate și z[0].suprafata. Densitatea este numărul de locuitori împărțit la suprafață, deci numărul de locuitori este produsul lor.

    b), c) și d) pun indicele sau numele variabilei în locuri greșite și nu sunt expresii C/C++ valide.

  5. Exercițiul 5 4p Grafuri neorientate

    Un graf neorientat are 7 noduri, numerotate de la 1 la 7, și 8 muchii, dintre care șase sunt:

    1. [1,2]
    2. [2,5]
    3. [2,6]
    4. [2,7]
    5. [3,7]
    6. [4,7]

    Știind că unul dintre lanțurile elementare care au lungimea maximă este 3, 7, 4, 5, 2, 1, indicați care ar putea fi celelalte două muchii ale grafului.

    • a)[1,6] și [4,5]
    • b)[2,3] și [2,4]
    • c)[2,3] și [4,5]
    • d)[2,4] și [5,7]
    Vezi rezolvarea

    Răspuns corect: c) [2,3] și [4,5]

    Lanțul 3, 7, 4, 5, 2, 1 folosește muchiile [3,7], [7,4], [4,5], [5,2] și [2,1]. Dintre ele, doar [4,5] nu se află printre cele șase date, deci este una dintre muchiile lipsă. Rămân variantele a) și c).

    În a), muchia [1,6] ar prelungi lanțul: 3, 7, 4, 5, 2, 1, 6 are lungimea 6, deci lanțul dat n-ar mai avea lungime maximă. În c), nodurile 1 și 6 au un singur vecin, pe 2, deci nu pot fi amândouă capete ale unui lanț prin toate cele 7 noduri: lungimea maximă rămâne 5.

Subiectul al II-lea

40 de puncte
  1. Exercițiul 1.a 6p Algoritmi în pseudocod

    Algoritmul alăturat este reprezentat în pseudocod.

    Scrieți ce se afișează în urma executării algoritmului dacă se citesc, în această ordine, valorile 27 și 38.

    citește m,n
      (numere naturale, 1<m<n)
    ┌repetă
    │ x←m; y←n; n←n-1
    │┌repetă
    ││┌dacă x>y atunci x←x-y
    │││altfel y←y-x
    ││└■
    │└până când y=0
    └până când x≠1
     scrie n+1
    Vezi rezolvarea

    Răspunsul din barem: 36

    Al doilea repetă calculează, prin scăderi repetate, cel mai mare divizor comun al lui m și al valorii curente a lui n, iar primul repetă se oprește când acesta nu mai este 1. Se afișează n+1, adică exact valoarea verificată ultima, fiindcă n fusese deja micșorat. Pentru m=27: cmmdc(27,38)=1, cmmdc(27,37)=1, cmmdc(27,36)=9, deci se afișează 36.

  2. Exercițiul 1.b 6p Algoritmi în pseudocod

    Același algoritm ca la 1.a.

    Dacă pentru variabila m se citește numărul 5, scrieți două valori care pot fi citite pentru variabila n astfel încât, în urma executării algoritmului, pentru fiecare dintre acestea, valoarea afișată să fie 10.

    Vezi rezolvarea

    Exemplu: 10 și 14

    Pentru m=5, se afișează primul număr care se împarte la 5, coborând de la n. Acesta este 10 pentru orice n de la 10 la 14; pentru n=15 s-ar afișa chiar 15.

  3. Exercițiul 1.c 10p Algoritmi în pseudocod

    Același algoritm ca la 1.a.

    Scrieți programul C/C++ corespunzător algoritmului dat.

    Vezi rezolvarea
    #include <iostream>
    using namespace std;
    
    int main()
    {
        int m, n, x, y;
        cin >> m >> n;
        do
        {
            x = m; y = n; n = n - 1;
            do
            {
                if (x > y) x = x - y;
                else y = y - x;
            } while (y != 0);
        } while (x == 1);
        cout << n + 1;
        return 0;
    }

    repetă…până când y=0 devine do…while (y != 0), iar repetă…până când x≠1 devine do…while (x == 1): în C/C++ se scrie condiția de continuare, adică negația celei de oprire.

  4. Exercițiul 1.d 6p Algoritmi în pseudocod

    Același algoritm ca la 1.a.

    Scrieți în pseudocod un algoritm echivalent cu cel dat, înlocuind adecvat a doua structură repetă...până când cu o structură repetitivă cu test inițial.

    Vezi rezolvarea
    citește m,n (numere naturale, 1<m<n)
    ┌repetă
    │ x←m; y←n; n←n-1
    │┌cât timp y≠0 execută
    ││┌dacă x>y atunci x←x-y
    │││altfel y←y-x
    ││└■
    │└■
    └până când x≠1
    scrie n+1

    repetă…până când execută corpul cel puțin o dată, iar cât timp poate să nu îl execute deloc. Aici nu contează: n nu scade niciodată sub m (pentru n=m cel mai mare divizor comun este m, deci bucla exterioară se oprește), așa că y←n primește mereu o valoare nenulă și corpul s-ar executa oricum. Condiția de continuare este negația celei de oprire: y≠0.

  5. Exercițiul 2 6p Arbori

    Un arbore cu 9 noduri, numerotate de la 1 la 9, are muchiile:

    1. [1,2]
    2. [2,8]
    3. [2,9]
    4. [3,6]
    5. [4,6]
    6. [5,8]
    7. [6,8]
    8. [7,8]

    Scrieți două noduri care pot fi alese drept rădăcină, astfel încât nodul 8 să aibă doi “frați”.

    Vezi rezolvarea

    2 6

    Nodul 8 are vecinii 2, 5, 6 și 7. Ca 8 să aibă doi frați, tatăl lui trebuie să aibă trei fii, iar tatăl lui 8 este unul dintre vecinii lui. Nodul 2 are vecinii 1, 8 și 9, iar nodul 6 are vecinii 3, 4 și 8. Un nod cu trei vecini are trei fii doar când este chiar rădăcina; altfel unul dintre vecini îi este tată. Cu rădăcina 2, fiii lui 2 sunt 1, 8 și 9; cu rădăcina 6, fiii lui 6 sunt 3, 4 și 8. Nodurile 5 și 7 au un singur vecin, deci nu pot fi tatăl lui 8 cu trei fii.

  6. Exercițiul 3 6p Șiruri de caractere

    Variabilele tI, pN și tL permit accesul la câte un șir de maximum 20 de caractere. Inițial, șirul accesat prin tL este vid, șirul accesat prin tI reprezintă un număr de telefon în format internațional, iar șirul accesat prin pN reprezintă un prefix național sau este un șir vid.

    Numărul de telefon în format internațional conține codul de țară, scris între paranteze rotunde, urmat de cifrele numărului propriu-zis. Codul de țară este format din cifre sau din simbolul + (plus), urmat de cifre. În multe țări, pentru a forma local un număr de telefon, se înlocuiește secvența formată din paranteze și codul de țară cu un prefix național format din cifre (de exemplu 0, în România) sau cu șirul vid (de exemplu în SUA).

    Scrieți o secvență de instrucțiuni C/C++ astfel încât, în urma executării acesteia, șirul accesat prin tL să reprezinte numărul de telefon format local. Declarați corespunzător eventualele alte variabile utilizate.

    Exemplu: dacă prin variabila tI se accesează șirul (+254)722123456, iar prin variabila pN se accesează șirul 0, atunci numărul format local este 0722123456, iar dacă prin variabila tI se accesează șirul (+1)2121234567, iar prin variabila pN se accesează șirul vid, atunci numărul format local este 2121234567.

    Vezi rezolvarea
    strcpy(tL, pN);
    strcat(tL, strchr(tI, ')') + 1);

    Numărul local este prefixul național urmat de cifrele de după paranteza închisă. strchr(tI, ')') indică paranteza, deci de la poziția următoare începe numărul propriu-zis. În tL se copiază întâi prefixul (chiar dacă e șirul vid), apoi i se adaugă restul numărului.

Subiectul al III-lea

30 de puncte
  1. Exercițiul 1 10p Subprograme

    Subprogramul Plus are un singur parametru, n, prin care primește un număr natural (n∈[10,10^9)). Subprogramul înlocuiește în n fiecare secvență 25 cu câte o secvență 26 și furnizează, prin același parametru, numărul obținut. Dacă nu se înlocuiește nicio secvență, subprogramul furnizează numărul nemodificat.

    Scrieți definiția completă a subprogramului C/C++.

    Exemplu: dacă n=202535250, după apel n=202635260.

    Vezi rezolvarea
    void Plus(int &n)
    {
        int m = n, r = 0, p = 1, c;
        while (m > 0)
        {
            c = m % 10;
            if (c == 5 && m / 10 % 10 == 2) c = 6;
            r = r + c * p;
            p = p * 10;
            m = m / 10;
        }
        n = r;
    }

    Cifrele lui n se iau de la dreapta, cu m%10, și se pun într-un număr nou r, fiecare pe poziția ei (p este puterea lui 10 a poziției). O cifră 5 care are în stânga cifra 2 este finalul unei secvențe 25, deci în locul ei se pune 6. Pentru că p crește la fiecare cifră, și zerourile de la finalul lui n rămân la locul lor. Rezultatul se furnizează prin parametrul transmis prin referință, int &n.

  2. Exercițiul 2 10p Tablouri bidimensionale

    Terenul alocat unui târg de jucării artizanale a fost împărțit în zone dispuse ca elementele unui tablou bidimensional cu număr egal de linii și coloane. Pentru a putea fi testate de copii, fiecare jucărie are alocată o zonă și este identificată printr-un număr natural. Organizatorii au hotărât eliminarea tuturor jucăriilor plasate pe diagonala secundară a tabloului și rearanjarea celor păstrate, prin deplasarea unora dintre acestea cu câte o poziție spre stânga, astfel încât să nu existe zone intermediare libere, ca în exemplu.

    Scrieți un program C/C++ care citește de la tastatură numere naturale din intervalul [2,10^2], și anume n și elementele unui tablou bidimensional cu n linii și n coloane, reprezentând numerele de identificare ale jucăriilor, în ordinea plasării lor inițiale pe teren. Programul modifică apoi tabloul în memorie corespunzător hotărârii organizatorilor și afișează pe ecran tabloul obținut, fiecare linie a tabloului pe câte o linie a ecranului, elementele de pe aceeași linie fiind separate prin câte un spațiu.

    Exemplu: pentru n=4 și tabloul

    Două tablouri. Primul, cu 4 linii și 4 coloane: 20 25 20 26; 36 16 48 52; 64 72 35 90; 85 36 12 25, cu valorile 26, 48, 72 și 85 de pe diagonala secundară colorate cu gri. Se obține al doilea, cu 4 linii și 3 coloane: 20 25 20; 36 16 52; 64 35 90; 36 12 25.
    Vezi rezolvarea
    #include <iostream>
    using namespace std;
    
    int main()
    {
        int n, a[100][100], i, j;
        cin >> n;
        for (i = 0; i < n; i++)
            for (j = 0; j < n; j++)
                cin >> a[i][j];
        for (i = 0; i < n; i++)
            for (j = n - 1 - i; j < n - 1; j++)
                a[i][j] = a[i][j + 1];
        for (i = 0; i < n; i++)
        {
            for (j = 0; j < n - 1; j++)
                cout << a[i][j] << ' ';
            cout << '\n';
        }
        return 0;
    }

    Pe linia i (numerotând de la 0), elementul de pe diagonala secundară este în coloana n-1-i. Elementele de după el se mută cu o poziție spre stânga, peste el, deci fiecare linie rămâne cu n-1 jucării, fără spații libere între ele. Se afișează primele n-1 elemente de pe fiecare linie.

  3. Exercițiul 3.a 2p Algoritmi eficienți

    Se citește de la tastatură un număr natural, n (n∈[1,10^9]), și se cere să se scrie în fișierul text bac.txt cel mai mare număr natural p cu proprietatea că numărul 26^p este divizor al numărului obținut prin calcularea produsului 1∙2∙3∙...∙n.

    Proiectați un algoritm eficient din punctul de vedere al timpului de executare și al memoriei utilizate.

    Exemplu: dacă n=28, atunci fișierul conține numărul 2 (26^2=676 este divizor al lui 1∙2∙3∙..∙28 = 304888344611713860501504000000)

    Descrieți în limbaj natural algoritmul proiectat, justificând eficiența acestuia.

    Vezi rezolvarea

    Timp de executare: O(log n) · Memorie: O(1)

    26 = 2·13, iar p este cea mai mare putere pentru care 26^p divide produsul 1·2·…·n. În acest produs factorul 2 apare de mai multe ori decât factorul 13 (fiecare al doilea număr este par, dar doar fiecare al treisprezecelea se împarte la 13), deci p este numărul de apariții ale lui 13 în descompunerea produsului.

    Dintre numerele de la 1 la n, [n/13] se împart la 13 și aduc câte un 13; dintre ele, [n/13^2] se împart la 13^2 și mai aduc unul, [n/13^3] încă unul și așa mai departe. Deci p = [n/13] + [n/13^2] + [n/13^3] + …, adunând cât timp puterea lui 13 nu depășește n.

    Eficiență: se calculează câte un termen pentru fiecare putere a lui 13 până la n (cel mult 8 pentru n ≤ 10^9), deci numărul de pași este logaritmic, sub cel liniar cerut. Se folosesc doar câteva variabile simple, deci memoria este constantă.

  4. Exercițiul 3.b 8p Algoritmi eficienți

    Se citește de la tastatură un număr natural, n (n∈[1,10^9]), și se cere să se scrie în fișierul text bac.txt cel mai mare număr natural p cu proprietatea că numărul 26^p este divizor al numărului obținut prin calcularea produsului 1∙2∙3∙...∙n.

    Proiectați un algoritm eficient din punctul de vedere al timpului de executare și al memoriei utilizate.

    Exemplu: dacă n=28, atunci fișierul conține numărul 2 (26^2=676 este divizor al lui 1∙2∙3∙..∙28 = 304888344611713860501504000000)

    Scrieți programul C/C++ corespunzător algoritmului proiectat.

    Vezi rezolvarea
    #include <fstream>
    #include <iostream>
    using namespace std;
    
    int main()
    {
        long long n, p = 0, q = 13;
        cin >> n;
        while (q <= n)
        {
            p = p + n / q;
            q = q * 13;
        }
        ofstream fout("bac.txt");
        fout << p;
        fout.close();
        return 0;
    }

    Programul adună termenii de la 3.a. q este long long: la ultimul pas, după ce trece de n, q*13 poate depăși limita tipului int.

Vrei să vezi ce notă ai lua la examen?

Intră în modul simulare: ai cronometru de 3 ore, codul ți se compilează pe loc, iar la final primești nota conform baremului.

Începe simularea3 ore

Ai găsit o problemă sau ai o idee?

Despre ce este vorba?