Costel este pasionat de circuitele logice. El are la dispoziție două tipuri de circuite logice simple: circuit ȘI
, respectiv circuit SAU
. Circuitele logice simple au două intrări și o ieșire.
La fiecare intrare în circuit se poate introduce un bit 0
sau un bit 1
, iar circuitul este capabil să calculeze operația logică respectivă (ȘI
ori SAU
) și să trimită rezultatul obținut la ieșire. Costel a învățat că poate combina mai multe circuite simple pentru a obține circuite complexe astfel: leagă ieșirea unui circuit de orice tip la una din intrările altui circuit, deci rezultatul obținut la ieșirea dintr-un circuit se transmite la intrarea celuilalt. În acest fel se pot construi circuite complexe, care au mai multe intrări și o singură ieșire.
Ultima descoperire a lui Costel este circuitul logic piramidal (prescurtat CLP), care are structura următoare:
- Circuitul cu un singur nivel este cel mai simplu tip de circuit și este compus dintr-un circuit
ȘI
ori dintr-un circuitSAU
; - Pentru un circuit cu mai multe nivele avem:
- pe nivelul 1 se găsește un singur circuit (
ȘI
oriSAU
); - pe nivelul 2 se găsesc două circuite simple de oricare tip; ieșirea primului circuit este conectată la intrarea
1
a circuitului de pe nivelul 1, iar ieșirea celui de-al doilea circuit este conectată la intrarea2
a circuitului de pe nivelul 1; - pe nivelul sunt circuite simple; ieșirile primelor două circuite de pe linia sunt conectate la intrările primului circuit de pe nivelul , ieșirile următoarelor două sunt conectate la intrările celui de-al doilea circuit de pe linia , etc.
- pe nivelul 1 se găsește un singur circuit (
Exemplu de CLP cu 2 nivele:
Într-un CLP cu nivele avem intrări, corespunzătoare circuitelor de pe nivelul . La fiecare intrare se poate introduce un bit 0
sau un bit 1
, deci un șir de biți.
Pentru circuitul din figura de mai sus presupunem că la cele patru intrări ale circuitelor de pe nivelul 2 avem, în ordine, biții 0111
. La ieșirea din circuit (ieșirea circuitului simplu de pe primul nivel) se obține valoarea , deoarece acest circuit este echivalent cu expresia logică ((0 ȘI 1) ȘI (1 SAU 1))
.
Cerința 1 (30 puncte)
Pentru un CLP dat, cu nivele și pentru șiruri de biți date la intrarea circuitului, să se determine, pentru fiecare șir, valoarea calculată la ieșirea din circuit.
Cerința 2 (70 puncte)
Pentru un CLP dat, cu nivele și cunoscând valoarea obținută la ieșire ( sau ), să se determine numărul șirurilor de biți distincte ce pot fi date la intrare pentru a se obține valoarea specificată la ieșire. Rezultatul poate fi un număr foarte mare, de aceea el se va afișa modulo .
Date de intrare
Pe prima linie a fișierului logic.in
se găsește un număr natural ( pentru cerința 1, respectiv pentru cerința 2). Pe a doua linie se găsește numărul natural , reprezentând numărul de nivele ale circuitului.
Pe următoarele linii (linii de la la ) se găsește descrierea circuitului, fără spații între caractere, astfel:
- pe linia un caracter
&
sau|
, unde prin caracterul&
se codifică un circuitȘI
, iar prin caracterul|
se codifică un circuitSAU
; - pe linia două caractere din mulțimea
{&, |}
; - pe linia patru caractere din mulțimea
{&, |}
; - pe linia avem caractere din mulțimea
{&, |}
.
Pentru cerința 1:
- Pe linia avem un număr natural , reprezentând numărul șirurilor de biți date la intrarea în circuit;
- Pe fiecare dintre următoarele linii avem câte un șir compus din biți (caractere
0
sau1
), reprezentând șirul de biți dat la intrare.
Pentru cerința 2:
- Pe linia avem un număr natural din mulțimea , reprezentând valoarea pe care circuitul trebuie să o scoată la ieșire.
Date de ieșire
Pentru cerința 1 se vor afișa în fișierul logic.out
, pe linii separate, numere naturale din mulțimea , cu semnificația din enunț.
Pentru cerința 2 se va afișa în fișierul logic.out
un număr natural cu semnificația din enunț.
Restricții și precizări
- Tabelele operațiilor logice sunt:
Exemplu 1
logic.in
1
2
&
&|
3
1101
0100
1000
logic.out
1
0
0
Explicație
, deci rezolvăm cerința 1. Pentru șirul de biți 1101
valoarea obținută la ieșirea din circuit este rezultatul evaluării expresiei: ((1 ȘI 1) ȘI (1 SAU 0)) = (1 ȘI 1) = 1
.
Pentru șirul de biți 0100
valoarea obținută la ieșirea din circuit este rezultatul evaluării expresiei: ((0 ȘI 1) ȘI (0 SAU 0)) = (0 ȘI 0) = 0
.
Pentru șirul de biți 1000
valoarea obținută la ieșirea din circuit este rezultatul evaluării expresiei: ((1 ȘI 0) ȘI (0 SAU 0) = (0 ȘI 0) = 0
.
Exemplu 2
logic.in
2
2
&
&|
1
logic.out
3
Explicație
, deci rezolvăm cerința 2. Sunt șiruri de biți pentru care se obține valoarea la ieșirea din circuit: 1101
, 1110
și 1111
.