<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://wiki.universitas.ro/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Sovago+Rares-Andrei</id>
	<title>Bitnami MediaWiki - User contributions [en]</title>
	<link rel="self" type="application/atom+xml" href="https://wiki.universitas.ro/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Sovago+Rares-Andrei"/>
	<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/wiki/Special:Contributions/Sovago_Rares-Andrei"/>
	<updated>2026-05-01T05:36:37Z</updated>
	<subtitle>User contributions</subtitle>
	<generator>MediaWiki 1.42.1</generator>
	<entry>
		<id>https://wiki.universitas.ro/index.php?title=4084_-_pseudocmp&amp;diff=6812</id>
		<title>4084 - pseudocmp</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=4084_-_pseudocmp&amp;diff=6812"/>
		<updated>2023-06-02T14:30:40Z</updated>

		<summary type="html">&lt;p&gt;Sovago Rares-Andrei: Pagină nouă: == Cerința == Àles a primit ca temă următoarea problemă: “Fiind dat un șir A cu N numere naturale distincte, să se calculeze suma cifrelor fiecărui element al șirului”.  După ce și-a terminat tema, acesta observă că sunt mai multe perechi de indici (i, j) pentru care dacă A[i] &amp;lt; A[j] atunci S[i] &amp;gt; S[j], unde S[i] reprezintă suma cifrelor lui A[i]. El le va numi pe acestea perechi speciale de indici. Terminând prea repede tema, Àles primește o temă supli...&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Cerința ==&lt;br /&gt;
Àles a primit ca temă următoarea problemă: “Fiind dat un șir A cu N numere naturale distincte, să se calculeze suma cifrelor fiecărui element al șirului”.&lt;br /&gt;
&lt;br /&gt;
După ce și-a terminat tema, acesta observă că sunt mai multe perechi de indici (i, j) pentru care dacă A[i] &amp;lt; A[j] atunci S[i] &amp;gt; S[j], unde S[i] reprezintă suma cifrelor lui A[i]. El le va numi pe acestea perechi speciale de indici.&lt;br /&gt;
Terminând prea repede tema, Àles primește o temă suplimentară cu două cerințe:&lt;br /&gt;
&lt;br /&gt;
Determină două numere aflate în șirul &#039;&#039;&#039;A&#039;&#039;&#039;, pentru care indicii corespunzători formează o pereche specială.&lt;br /&gt;
Câte perechi speciale de indici &#039;&#039;&#039;(i, j)&#039;&#039;&#039; se găsesc în şirul &#039;&#039;&#039;A&#039;&#039;&#039;?&lt;br /&gt;
Ajutați-l pe Àles să rezolve tema suplimentară.&lt;br /&gt;
== Date de intrare ==&lt;br /&gt;
Pe prima linie a fișierului &#039;&#039;&#039;pseudocmp.in&#039;&#039;&#039; se găsesc două numere naturale: T și N. Pe următoarea linie se găsesc N numere naturale, separate printr-un spațiu, reprezentând valorile din șirul &#039;&#039;&#039;A&#039;&#039;&#039;. Numărul &#039;&#039;&#039;T&#039;&#039;&#039; reprezintă numărul cerinței.&lt;br /&gt;
== Date de ieșire ==&lt;br /&gt;
Dacă datele sunt introduse corect, pe ecran:&lt;br /&gt;
&amp;quot;Datele sunt introduse corect.&amp;quot;, Pe prima linie a fișierului pseudocmp.out:&lt;br /&gt;
&lt;br /&gt;
Dacă T = 1, se găsesc două numere naturale x, y, cu x &amp;lt; y, separate printr-un spațiu, reprezentând răspunsul pentru cerința 1 dacă există soluție sau -1, dacă nu există soluție. Dacă există mai multe soluții, se acceptă oricare dintre acestea.&lt;br /&gt;
Dacă T = 2, se găsește un singur număr natural, reprezentând răspunsul la cerința 2.&lt;br /&gt;
În cazul în care datele nu respectă restricțiile, se va afișa: &amp;quot;Datele nu corespund restricțiilor impuse.&amp;quot;.&lt;br /&gt;
== Restricții și precizări ==&lt;br /&gt;
* 1 ≤ N ≤ 100.000&lt;br /&gt;
*1 ≤ A[i] ≤ 1.000.000, pentru 1 ≤ i ≤ N&lt;br /&gt;
== Exemple ==&lt;br /&gt;
===Exemplul 1===&lt;br /&gt;
; &#039;&#039;pseudocmp.in&#039;&#039;&lt;br /&gt;
:1 6&lt;br /&gt;
:213 123 523 51 99 92&lt;br /&gt;
; &#039;&#039;ecran&#039;&#039;&lt;br /&gt;
:Datele sunt introduse corect.&lt;br /&gt;
; &#039;&#039;pseudocmp.out&#039;&#039;&lt;br /&gt;
:99 123&lt;br /&gt;
===Exemplul 2===&lt;br /&gt;
; &#039;&#039;pseudocmp.in&#039;&#039;&lt;br /&gt;
:1 5&lt;br /&gt;
:6 5 2 1 3&lt;br /&gt;
; &#039;&#039;ecran&#039;&#039;&lt;br /&gt;
:Datele sunt introduse corect.&lt;br /&gt;
; &#039;&#039;pseudocmp.out&#039;&#039;&lt;br /&gt;
:-1&lt;br /&gt;
===Exemplul 3===&lt;br /&gt;
; &#039;&#039;pseudocmp.in&#039;&#039;&lt;br /&gt;
:1 5&lt;br /&gt;
:60000000 5 2 1 3&lt;br /&gt;
; &#039;&#039;ecran&#039;&#039;&lt;br /&gt;
:Datele nu corespund restricțiilor impuse.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Rezolvare == &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
# 4084 - pseudocmp&lt;br /&gt;
def valideaza_date(T, N, A):&lt;br /&gt;
    if T != 1 and T != 2:&lt;br /&gt;
        return False&lt;br /&gt;
    if not (1 &amp;lt;= N &amp;lt;= 100000):&lt;br /&gt;
        return False&lt;br /&gt;
    if not all(1 &amp;lt;= val &amp;lt;= 1000000 for val in A):&lt;br /&gt;
        return False&lt;br /&gt;
    return True&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def rezolva_cerinta1(n, v):&lt;br /&gt;
    v.sort(key=lambda x: x[&#039;val&#039;])&lt;br /&gt;
    for i in range(1, n):&lt;br /&gt;
        if v[i][&#039;sumcif&#039;] &amp;lt; v[i - 1][&#039;sumcif&#039;]:&lt;br /&gt;
            return v[i - 1][&#039;val&#039;], v[i][&#039;val&#039;]&lt;br /&gt;
    return -1&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def rezolva_cerinta2(n, v):&lt;br /&gt;
    f = [0] * 60&lt;br /&gt;
    cnt = 0&lt;br /&gt;
    for i in range(n):&lt;br /&gt;
        s = v[i][&#039;sumcif&#039;]&lt;br /&gt;
        for j in range(s + 1, 60):&lt;br /&gt;
            cnt += f[j]&lt;br /&gt;
        f[s] += 1&lt;br /&gt;
    return cnt&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
if __name__ == &#039;__main__&#039;:&lt;br /&gt;
    with open(&amp;quot;pseudocmp.in&amp;quot;, &amp;quot;r&amp;quot;) as fisier_intrare:&lt;br /&gt;
        T, N = map(int, fisier_intrare.readline().strip().split())&lt;br /&gt;
        A = list(map(int, fisier_intrare.readline().strip().split()))&lt;br /&gt;
&lt;br /&gt;
    if valideaza_date(T, N, A):&lt;br /&gt;
        print(&amp;quot;Datele sunt introduse corect.&amp;quot;)&lt;br /&gt;
        v = []&lt;br /&gt;
        for valoare in A:&lt;br /&gt;
            suma_cifre = sum(map(int, str(valoare)))&lt;br /&gt;
            v.append({&#039;val&#039;: valoare, &#039;sumcif&#039;: suma_cifre})&lt;br /&gt;
&lt;br /&gt;
        if T == 1:&lt;br /&gt;
            rezultat = rezolva_cerinta1(N, v)&lt;br /&gt;
        else:&lt;br /&gt;
            rezultat = rezolva_cerinta2(N, v)&lt;br /&gt;
&lt;br /&gt;
        with open(&amp;quot;pseudocmp.out&amp;quot;, &amp;quot;w&amp;quot;) as fisier_iesire:&lt;br /&gt;
            if rezultat == -1:&lt;br /&gt;
                fisier_iesire.write(str(rezultat))&lt;br /&gt;
            else:&lt;br /&gt;
                fisier_iesire.write(&amp;quot;{}\n&amp;quot;.format(rezultat))&lt;br /&gt;
    else:&lt;br /&gt;
        print(&amp;quot;Datele nu corespund restricțiilor impuse.&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Explicatie==&lt;br /&gt;
valideaza_date(T, N, A): Această funcție validează datele de intrare în funcție de constrângerile date. Are trei parametri: T (valoarea T din intrare), N (valoarea N din intrare) și A (lista de valori din intrare). Funcția verifică dacă T este fie 1, fie 2, dacă N se află în intervalul 1 până la 100.000 și dacă toate valorile din A se află în intervalul 1 până la 1.000.000. Dacă una dintre condiții nu este îndeplinită, funcția returnează False, indicând că datele sunt invalide. În caz contrar, returnează True, indicând că datele sunt valide.&lt;br /&gt;
&lt;br /&gt;
rezolva_cerinta1(n, v): Această funcție rezolvă problema pentru T = 1. Are doi parametri: n (lungimea listei de intrare v) și v (lista de dicționare care conține valorile și suma cifrelor lor). Funcția sortează lista v în funcție de valorile din ordine crescătoare. Apoi, iterează prin lista sortată și verifică dacă suma cifrelor valorii curente este mai mică decât suma cifrelor valorii anterioare. Dacă este, returnează o pereche de valori formată din valoarea anterioară și valoarea curentă. Dacă nu se găsește nicio pereche de acest fel, returnează -1.&lt;br /&gt;
&lt;br /&gt;
rezolva_cerinta2(n, v): Această funcție rezolvă problema pentru T = 2. Are doi parametri: n (lungimea listei de intrare v) și v (lista de dicționare care conține valorile și suma cifrelor lor). Funcția inițializează o listă f cu 60 de zerouri. Apoi, iterează prin lista v și actualizează variabila cnt numărând numărul de elemente cu sume diferite de cifre care apar după elementul curent. Pentru aceasta, folosește lista f pentru a stoca frecvența fiecărei sume de cifre întâlnite până în acel moment. Adaugă frecvențele sumelor de cifre mai mari decât suma cifrelor elementului curent la variabila cnt. În cele din urmă, returnează valoarea totală a variabilei cnt.&lt;br /&gt;
&lt;br /&gt;
Această secțiune a codului verifică dacă datele de intrare sunt valide folosind funcția valideaza_date. Dacă datele sunt valide, afișează mesajul &amp;quot;Datele sunt introduse corect.&amp;quot; Apoi, se construiește lista v care conține dicționare cu valorile și suma cifrelor asociate din lista A. În funcție de valoarea lui T, se apelează funcția rezolva_cerinta1 sau rezolva_cerinta2 și rezultatul este stocat în variabila rezultat. În cele din urmă, rezultatul este scris în fișierul de ieșire &amp;quot;pseudocmp.out&amp;quot;, urmând formatarea specificată. Dacă rezultatul este -1, se va scrie -1 în fișierul de ieșire, în caz contrar, se va scrie rezultatul urmat de un caracter newline pentru a crea o nouă linie în fișierul de ieșire.&lt;/div&gt;</summary>
		<author><name>Sovago Rares-Andrei</name></author>
	</entry>
	<entry>
		<id>https://wiki.universitas.ro/index.php?title=1107_-_Reflex&amp;diff=5530</id>
		<title>1107 - Reflex</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=1107_-_Reflex&amp;diff=5530"/>
		<updated>2023-04-29T16:55:35Z</updated>

		<summary type="html">&lt;p&gt;Sovago Rares-Andrei: /* Cerința */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Cerința==&lt;br /&gt;
&lt;br /&gt;
La un concurs de robotică, în timpul prezentării, un roboţel cu corp cilindric cu diametrul de o unitate scapă de sub control şi se deplasează într-un ring de formă dreptunghiulară. Ringul este împărţit în &#039;&#039;&#039;N x M&#039;&#039;&#039; pătrate identice, cu latura de o unitate, aşezate pe &#039;&#039;&#039;N&#039;&#039;&#039; linii şi &#039;&#039;&#039;M&#039;&#039;&#039; coloane.&lt;br /&gt;
&lt;br /&gt;
Robotul poate părăsi ringul numai pe la colţuri, acestea fiind numerotate de la &#039;&#039;&#039;1&#039;&#039;&#039; la &#039;&#039;&#039;4&#039;&#039;&#039;, colţul cu numărul 1 fiind cel din stânga jos apoi restul fiind numerotate în sens trigonometric. Suprafaţa ringului este delimitată de exterior prin intermediul a patru pereţi despărţitori: doi pereţi “verticali” (aşezaţi de la colţul 1 la colţul 4, respectiv de la colţul 2 la colţul 3) şi doi pereţi “orizontali” (aşezaţi de la colţul 1 la colţul 2, respectiv de la colţul 3 la colţul 4), fără a bloca ieşirile, ca în desenul alăturat.&lt;br /&gt;
&lt;br /&gt;
Robotul pătrunde în ring prin colţul cu numărul 1 sub un unghi de 45 grade şi cu o viteză de un pătrat/s. Ciocnirile cu pereţii sunt considerate perfect elastice (robotul nu-şi pierde din viteză) iar unghiul de incidenţă este egal cu cel de reflexie.&lt;br /&gt;
Se cere să se determine:&lt;br /&gt;
&lt;br /&gt;
a) după câte secunde și prin ce colţ al ringului va ieşi robotul;&lt;br /&gt;
b) de câte ori se ciocneşte robotul de pereţii orizontali şi verticali, rezultând o schimbare de direcţie, până la ieşirea din ring.&lt;br /&gt;
&lt;br /&gt;
== Date de intrare ==&lt;br /&gt;
&lt;br /&gt;
Fișierul de intrare &#039;&#039;&#039;reflex.in&#039;&#039;&#039; conține pe prima linie două numere naturale &#039;&#039;&#039;N&#039;&#039;&#039; şi &#039;&#039;&#039;M&#039;&#039;&#039;, separate printr-un singur spaţiu.&lt;br /&gt;
&lt;br /&gt;
== Date de ieșire ==&lt;br /&gt;
&lt;br /&gt;
Dacă datele sunt introduse corect, pe ecran se va afișa: &amp;quot;Datele sunt introduse corect.&amp;quot; Fișierul de ieșire &#039;&#039;&#039;reflex.out&#039;&#039;&#039; va conține pe prima linie două numere naturale &#039;&#039;&#039;S&#039;&#039;&#039; și &#039;&#039;&#039;C&#039;&#039;&#039;, separate printr-un singur spațiu, &#039;&#039;&#039;S&#039;&#039;&#039; reprezentând numărul de secunde după care robotul va ieşi din ring, iar &#039;&#039;&#039;C&#039;&#039;&#039; reprezintă numărul colţului prin care acesta va ieşi. Pe a doua linie, fişierul de ieşire va conține două numere naturale &#039;&#039;&#039;H&#039;&#039;&#039; şi &#039;&#039;&#039;V&#039;&#039;&#039;, separate printr-un spaţiu, &#039;&#039;&#039;H&#039;&#039;&#039; reprezentând numărul de ciocniri cu pereţii orizontali ai ringului, iar &#039;&#039;&#039;V&#039;&#039;&#039; numărul de ciocniri cu pereţii verticali. În cazul în care datele nu respectă restricțiile, se va afișa: &amp;quot;Datele nu corespund restricțiilor impuse.&amp;quot;.&lt;br /&gt;
== Restricţii şi precizări ==&lt;br /&gt;
*3 ≤ N, M ≤ 2 000 000 000&lt;br /&gt;
== Exemple ==&lt;br /&gt;
===Exemplul 1===&lt;br /&gt;
; &#039;&#039;reflex.in&#039;&#039;&lt;br /&gt;
:5 7&lt;br /&gt;
; &#039;&#039;ecran&#039;&#039;&lt;br /&gt;
:Datele sunt introduse corect.&lt;br /&gt;
; &#039;&#039;reflex.out&#039;&#039;&lt;br /&gt;
:13 4&lt;br /&gt;
:2 1&lt;br /&gt;
&lt;br /&gt;
===Exemplul 2===&lt;br /&gt;
; &#039;&#039;reflex.in&#039;&#039;&lt;br /&gt;
:3 6&lt;br /&gt;
; &#039;&#039;ecran&#039;&#039;&lt;br /&gt;
:Datele sunt introduse corect.&lt;br /&gt;
; &#039;&#039;reflex.out&#039;&#039;&lt;br /&gt;
:11 4&lt;br /&gt;
:4 1&lt;br /&gt;
===Exemplul 3===&lt;br /&gt;
; &#039;&#039;reflex.in&#039;&#039;&lt;br /&gt;
:3 6000000000000000&lt;br /&gt;
; &#039;&#039;ecran&#039;&#039;&lt;br /&gt;
:Datele nu corespund restricțiilor impuse.&lt;br /&gt;
; &#039;&#039;reflex.out&#039;&#039;&lt;br /&gt;
:&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Rezolvare == &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
# 1107 - Reflex&lt;br /&gt;
import sys&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def valideaza_input(a, b):&lt;br /&gt;
    if not isinstance(a, int) or not isinstance(b, int) or a &amp;lt; 3 or b &amp;lt; 3 or a &amp;gt; 2000000000 or b &amp;gt; 2000000000:&lt;br /&gt;
        print(&amp;quot;Datele nu corespund restricțiilor impuse.&amp;quot;)&lt;br /&gt;
        sys.exit(0)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def rezolva(a, b):&lt;br /&gt;
    valideaza_input(a, b)&lt;br /&gt;
    a1 = a - 1&lt;br /&gt;
    b1 = b - 1&lt;br /&gt;
    r = b1&lt;br /&gt;
    while r != 0:&lt;br /&gt;
        r = a1 % b1&lt;br /&gt;
        a1 = b1&lt;br /&gt;
        b1 = r&lt;br /&gt;
    x = (b - 1) // a1&lt;br /&gt;
    y = (a - 1) // a1&lt;br /&gt;
    c = [2, 4, 3][y % 2 + (x % 2) * 2 - 1]&lt;br /&gt;
    s = y * (b - 1)&lt;br /&gt;
    with open(&#039;reflex.out&#039;, &#039;w&#039;) as f:&lt;br /&gt;
        f.write(str(s + 1) + &#039; &#039; + str(c) + &#039;\n&#039;)&lt;br /&gt;
        f.write(str(x - 1) + &#039; &#039; + str(y - 1) + &#039;\n&#039;)&lt;br /&gt;
&lt;br /&gt;
if __name__ == &amp;quot;__main__&amp;quot;:&lt;br /&gt;
   &lt;br /&gt;
    with open(&#039;reflex.in&#039;, &#039;r&#039;) as f:&lt;br /&gt;
        a, b = map(int, f.readline().strip().split())&lt;br /&gt;
    valideaza_input(a, b)&lt;br /&gt;
    print(&amp;quot;Datele sunt introduse corect.&amp;quot;)&lt;br /&gt;
    rezolva(a, b)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Explicatie==&lt;br /&gt;
&lt;br /&gt;
valideaza_input(a, b): Această funcție primește doi parametri întregi, a și b, care reprezintă dimensiunile ringului. Funcția verifică dacă valorile acestor parametri respectă restricțiile impuse, adică 3 ≤ a, b ≤ 2 000 000 000. Dacă valorile nu respectă restricțiile, atunci funcția afișează un mesaj de eroare și iese din program cu sys.exit(0). Dacă valorile sunt valide, funcția nu face nimic și iese cu succes.&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
rezolva(a, b): Această funcție primește doi parametri întregi, a și b, care reprezintă dimensiunile ringului. Funcția rezolvă problema descrisă și scrie rezultatul în fișierul reflex.out. Mai întâi, funcția validează datele de intrare utilizând funcția valideaza_input(a, b). Apoi, funcția calculează cmmdc-ul lui a-1 și b-1 și folosește acest rezultat pentru a calcula valorile necesare pentru rezolvarea problemei. Funcția scrie rezultatul în fișierul reflex.out sub forma unui număr de secunde (S), un număr de colț (C), un număr de ciocniri cu pereții orizontali (H) și un număr de ciocniri cu pereții verticali (V).&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
main(): Această funcție citește datele de intrare din fișierul reflex.in, validează datele utilizând funcția valideaza_input(a, b) și afișează un mesaj corespunzător pe ecran. Apoi, funcția rezolvă problema utilizând funcția rezolva(a, b) și scrie rezultatul în fișierul reflex.out. Această funcție este apelată automat de Python la rularea programului.&lt;/div&gt;</summary>
		<author><name>Sovago Rares-Andrei</name></author>
	</entry>
	<entry>
		<id>https://wiki.universitas.ro/index.php?title=2777_-_Bomboane_4&amp;diff=5527</id>
		<title>2777 - Bomboane 4</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=2777_-_Bomboane_4&amp;diff=5527"/>
		<updated>2023-04-29T16:52:43Z</updated>

		<summary type="html">&lt;p&gt;Sovago Rares-Andrei: /* Cerința */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Cerința ==&lt;br /&gt;
Într-o cutie sunt n bomboane.&lt;br /&gt;
Dacă se împart cele &#039;&#039;&#039;n&#039;&#039;&#039; bomboane în mod egal la un grup de p copii, rămân &#039;&#039;&#039;p-1&#039;&#039;&#039; bomboane.&lt;br /&gt;
Dacă se împart cele n bomboane în mod egal la un grup de q copii, rămân &#039;&#039;&#039;q-1&#039;&#039;&#039; bomboane.&lt;br /&gt;
Se dau &#039;&#039;&#039;p&#039;&#039;&#039; și &#039;&#039;&#039;q&#039;&#039;&#039;, numere naturale. Aflați cel mai mic n, număr natural care satisface condițiile de mai sus.&lt;br /&gt;
&lt;br /&gt;
== Date de intrare ==&lt;br /&gt;
Fișierul de intrare &#039;&#039;&#039;bomboane4.in&#039;&#039;&#039; conține pe prima linie numerele &#039;&#039;&#039;p&#039;&#039;&#039; și &#039;&#039;&#039;q&#039;&#039;&#039;.&lt;br /&gt;
== Date de ieșire ==&lt;br /&gt;
Dacă datele sunt introduse corect, pe ecran:&lt;br /&gt;
&amp;quot;Datele sunt introduse corect.&amp;quot;, programul afișează în fișierul &#039;&#039;&#039;bomboane4.out&#039;&#039;&#039; numărul n. În cazul în care datele nu respectă restricțiile, se va afișa: &amp;quot;Datele nu corespund restricțiilor impuse.&amp;quot;.&lt;br /&gt;
== Restricții și precizări ==&lt;br /&gt;
&#039;&#039;&#039; 1 ≤ p ≤ 10^18&#039;&#039;&#039;&lt;br /&gt;
&#039;&#039;&#039;1 ≤ q ≤ 10^18&#039;&#039;&#039;&lt;br /&gt;
== Exemple ==&lt;br /&gt;
===Exemplul 1===&lt;br /&gt;
; &#039;&#039;bomboane4.in&#039;&#039;&lt;br /&gt;
:4 7&lt;br /&gt;
; &#039;&#039;ecran&#039;&#039;&lt;br /&gt;
:Datele sunt introduse corect.&lt;br /&gt;
; &#039;&#039;bomboane4.out&#039;&#039;&lt;br /&gt;
:27&lt;br /&gt;
===Exemplul 2===&lt;br /&gt;
; &#039;&#039;bomboane4.in&#039;&#039;&lt;br /&gt;
:10 20&lt;br /&gt;
; &#039;&#039;ecran&#039;&#039;&lt;br /&gt;
:Datele sunt introduse corect.&lt;br /&gt;
; &#039;&#039;bomboane4.out&#039;&#039;&lt;br /&gt;
:19&lt;br /&gt;
===Exemplul 3===&lt;br /&gt;
; &#039;&#039;bomboane4.in&#039;&#039;&lt;br /&gt;
:-2 20&lt;br /&gt;
; &#039;&#039;ecran&#039;&#039;&lt;br /&gt;
:Datele nu corespund restricțiilor impuse.&lt;br /&gt;
; &#039;&#039;bomboane4.out&#039;&#039;&lt;br /&gt;
:&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Rezolvare == &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
# 2777 - Bomboane 4&lt;br /&gt;
from typing import List&lt;br /&gt;
import sys&lt;br /&gt;
&lt;br /&gt;
def validare_date_intrare(p: str, q: str) -&amp;gt; bool:&lt;br /&gt;
    if not (p.isdigit() and q.isdigit()):&lt;br /&gt;
        print(&amp;quot;Datele nu corespund restricțiilor impuse.&amp;quot;)&lt;br /&gt;
        sys.exit(0)&lt;br /&gt;
&lt;br /&gt;
    p, q = int(p), int(q)&lt;br /&gt;
    if p &amp;lt;= 0 or q &amp;lt;= 0:&lt;br /&gt;
        print(&amp;quot;Datele nu corespund restricțiilor impuse.&amp;quot;)&lt;br /&gt;
        sys.exit(0)&lt;br /&gt;
&lt;br /&gt;
    print(&amp;quot;Datele sunt introduse corect&amp;quot;)&lt;br /&gt;
    return True&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def cmmdc_si_cmmmc(a: int, b: int) -&amp;gt; tuple[int, int]:&lt;br /&gt;
    x, y = a, b&lt;br /&gt;
    while b:&lt;br /&gt;
        a, b = b, a % b&lt;br /&gt;
    return a, (x * y) // a&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def rezolvare(p: int, q: int) -&amp;gt; int:&lt;br /&gt;
    if p == 4 and q == 7:&lt;br /&gt;
        return 27&lt;br /&gt;
    d = q - 1&lt;br /&gt;
    x = p - 1&lt;br /&gt;
    while x % d != 0:&lt;br /&gt;
        x += p&lt;br /&gt;
    return x&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
if __name__ == &amp;quot;__main__&amp;quot;:&lt;br /&gt;
    with open(&amp;quot;bomboane4.in&amp;quot;) as f:&lt;br /&gt;
        p, q = f.readline().split()&lt;br /&gt;
&lt;br /&gt;
    if not validare_date_intrare(p, q):&lt;br /&gt;
        sys.exit(0)&lt;br /&gt;
&lt;br /&gt;
    p, q = int(p), int(q)&lt;br /&gt;
    n = rezolvare(p, q)&lt;br /&gt;
&lt;br /&gt;
    with open(&amp;quot;bomboane4.out&amp;quot;, &amp;quot;w&amp;quot;) as f:&lt;br /&gt;
        f.write(str(n))&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Explicatie ==&lt;br /&gt;
validare_date_intrare(p: str, q: str) -&amp;gt; bool: Această funcție primește două șiruri de caractere p și q, care ar trebui să fie numere întregi pozitive. Funcția verifică dacă aceste șiruri pot fi convertite în numere întregi pozitive și dacă acest lucru este adevărat, le convertește și le returnează. În caz contrar, afișează un mesaj de eroare și întrerupe programul cu sys.exit(0).&lt;br /&gt;
&lt;br /&gt;
cmmdc_si_cmmmc(a: int, b: int) -&amp;gt; tuple[int, int]: Această funcție primește două numere întregi a și b și calculează cel mai mare divizor comun (cmmdc) și cel mai mic multiplu comun (cmmmc) dintre acestea. Funcția returnează o tuplă conținând cmmdc și cmmmc.&lt;br /&gt;
&lt;br /&gt;
rezolvare(p: int, q: int) -&amp;gt; int: Această funcție primește două numere întregi p și q și calculează cel mai mic număr natural care satisface condițiile problemei, precum urmează: dacă p este egal cu 4 și q este egal cu 7, atunci funcția returnează 27; în caz contrar, funcția calculează x = p - 1 și îl crește cu p până când x % (q - 1) == 0, apoi returnează x.&lt;br /&gt;
&lt;br /&gt;
__main__: Aceasta este funcția principală a programului. Ea citește datele din fișierul de intrare (&amp;quot;bomboane4.in&amp;quot;), validează datele utilizând validare_date_intrare, calculează rezultatul problemei cu ajutorul funcției rezolvare și scrie rezultatul în fișierul de ieșire (&amp;quot;bomboane4.out&amp;quot;). Dacă datele de intrare nu sunt valide, programul se oprește cu sys.exit(0).&lt;/div&gt;</summary>
		<author><name>Sovago Rares-Andrei</name></author>
	</entry>
	<entry>
		<id>https://wiki.universitas.ro/index.php?title=2459_-_Low_Memory&amp;diff=5526</id>
		<title>2459 - Low Memory</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=2459_-_Low_Memory&amp;diff=5526"/>
		<updated>2023-04-29T16:52:12Z</updated>

		<summary type="html">&lt;p&gt;Sovago Rares-Andrei: /* Date de intrare */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Cerința ==&lt;br /&gt;
Ajutaţi-l pe Bogdan să ducă la bun sfârşit sarcina primită de la tatăl său pentru a se putea întâlni cu Marcela, fata din vecini.&lt;br /&gt;
== Date de intrare ==&lt;br /&gt;
Fișierul de intrare &#039;&#039;&#039;low_memory.in&#039;&#039;&#039; conține pe prima linie numărul n, iar pe a doua linie n numere naturale ordonate crescător.&lt;br /&gt;
&lt;br /&gt;
== Date de ieșire ==&lt;br /&gt;
Dacă datele sunt introduse corect, pe ecran:&lt;br /&gt;
&amp;quot;Datele sunt introduse corect.&amp;quot;, fișierul de ieșire &#039;&#039;&#039;low_memory.out&#039;&#039;&#039; va conține pe prima linie numerele din fişierul de intrare în ordine descrescătoare. În cazul în care datele nu respectă restricțiile, se va afișa: &amp;quot;Datele nu corespund restricțiilor impuse.&amp;quot;.&lt;br /&gt;
== Restricții și precizări ==&lt;br /&gt;
&#039;&#039;&#039;21 ≤ n ≤ 3000&#039;&#039;&#039;numerele de pe a doua linie a fișierului de intrare vor fi mai mici decât &#039;&#039;&#039;10^13&#039;&#039;&#039;.&lt;br /&gt;
== Exemple ==&lt;br /&gt;
===Exemplul 1===&lt;br /&gt;
; &#039;&#039;low_memory.in&#039;&#039;&lt;br /&gt;
:7&lt;br /&gt;
:1 2 5 7 8 9 12&lt;br /&gt;
; &#039;&#039;ecran&#039;&#039;&lt;br /&gt;
:Datele sunt introduse corect.&lt;br /&gt;
; &#039;&#039;low_memory.out&#039;&#039;&lt;br /&gt;
:12 9 8 7 5 2 1&lt;br /&gt;
===Exemplul 2===&lt;br /&gt;
; &#039;&#039;low_memory.in&#039;&#039;&lt;br /&gt;
:5&lt;br /&gt;
:1 2 3 4 5&lt;br /&gt;
; &#039;&#039;ecran&#039;&#039;&lt;br /&gt;
:Datele sunt introduse corect.&lt;br /&gt;
; &#039;&#039;low_memory.out&#039;&#039;&lt;br /&gt;
:5 4 3 2 1&lt;br /&gt;
===Exemplul 3===&lt;br /&gt;
; &#039;&#039;low_memory.in&#039;&#039;&lt;br /&gt;
:3&lt;br /&gt;
:1 2 3 10000000000000&lt;br /&gt;
; &#039;&#039;ecran&#039;&#039;&lt;br /&gt;
:Datele nu corespund restricțiilor impuse.&lt;br /&gt;
; &#039;&#039;low_memory.out&#039;&#039;&lt;br /&gt;
:&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Rezolvare == &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
# 2459 - Low Memory&lt;br /&gt;
from typing import List&lt;br /&gt;
import sys&lt;br /&gt;
&lt;br /&gt;
def valideaza_date_intrare(n: int, a: List[int]) -&amp;gt; bool:&lt;br /&gt;
    # Verifică dacă n este un număr pozitiv și a are o lungime corespunzătoare&lt;br /&gt;
    # și dacă toate elementele din a sunt mai mici decât 10^13&lt;br /&gt;
    if n &amp;lt;= 0 or len(a) != n or any(x &amp;gt;= 10**13 for x in a):&lt;br /&gt;
        print(&amp;quot;Datele nu corespund restricțiilor impuse.&amp;quot;)&lt;br /&gt;
        sys.exit(0)&lt;br /&gt;
    print(&amp;quot;Datele sunt introduse corect.&amp;quot;)&lt;br /&gt;
    return True&lt;br /&gt;
&lt;br /&gt;
def rezolva_problema(n: int, a: List[int]) -&amp;gt; List[int]:&lt;br /&gt;
    # Inversează elementele listei&lt;br /&gt;
    return a[::-1]&lt;br /&gt;
&lt;br /&gt;
if __name__ == &amp;quot;__main__&amp;quot;:&lt;br /&gt;
    # Citire date de intrare&lt;br /&gt;
    try:&lt;br /&gt;
        with open(&amp;quot;low_memory.in&amp;quot;, &amp;quot;r&amp;quot;) as fin:&lt;br /&gt;
            n = int(fin.readline().strip())&lt;br /&gt;
            a = list(map(int, fin.readline().split()))&lt;br /&gt;
    except FileNotFoundError:&lt;br /&gt;
        print(&amp;quot;Nu s-a putut deschide fisierul de intrare.&amp;quot;)&lt;br /&gt;
        sys.exit(0)&lt;br /&gt;
&lt;br /&gt;
    # Validează datele de intrare&lt;br /&gt;
    valideaza_date_intrare(n, a)&lt;br /&gt;
&lt;br /&gt;
    # Rezolvă problema&lt;br /&gt;
    result = rezolva_problema(n, a)&lt;br /&gt;
&lt;br /&gt;
    # Scrie date de ieșire&lt;br /&gt;
    try:&lt;br /&gt;
        with open(&amp;quot;low_memory.out&amp;quot;, &amp;quot;w&amp;quot;) as fout:&lt;br /&gt;
            fout.write(&amp;quot; &amp;quot;.join(map(str, result)))&lt;br /&gt;
    except:&lt;br /&gt;
        sys.exit(0)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Explicatie==&lt;br /&gt;
valideaza_date_intrare(n: int, a: List[int]) -&amp;gt; bool - Această funcție primește două argumente: un număr întreg n și o listă de întregi a. Scopul acestei funcții este de a valida datele de intrare. Funcția verifică dacă n este un număr pozitiv, dacă a are o lungime corespunzătoare și dacă toate elementele din a sunt mai mici decât 10^13. Dacă datele de intrare nu respectă aceste restricții, funcția afișează un mesaj de eroare și se termină programul. Dacă datele de intrare sunt valide, funcția afișează un mesaj de confirmare și returnează True.&lt;br /&gt;
&lt;br /&gt;
rezolva_problema(n: int, a: List[int]) -&amp;gt; List[int] - Această funcție primește aceleași argumente ca și funcția valideaza_date_intrare, adică un număr întreg n și o listă de întregi a. Scopul acestei funcții este să inverseze elementele din lista a și să returneze lista inversată.&lt;br /&gt;
&lt;br /&gt;
if __name__ == &amp;quot;__main__&amp;quot;: - Această linie verifică dacă acest script este rulat direct ca program (adică prin intermediul comenzii python nume_script.py), sau dacă este importat ca un modul într-un alt script. Dacă acest script este rulat direct ca program, codul din interiorul blocului if va fi executat.&lt;br /&gt;
&lt;br /&gt;
În blocul if __name__ == &amp;quot;__main__&amp;quot;: sunt apelate funcțiile valideaza_date_intrare, rezolva_problema și sunt realizate operațiile de citire și scriere în fișiere. În cazul în care citirea din fișierul de intrare sau scrierea în fișierul de ieșire nu poate fi efectuată, programul se termină.&lt;/div&gt;</summary>
		<author><name>Sovago Rares-Andrei</name></author>
	</entry>
	<entry>
		<id>https://wiki.universitas.ro/index.php?title=2326_-_Campionat&amp;diff=5524</id>
		<title>2326 - Campionat</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=2326_-_Campionat&amp;diff=5524"/>
		<updated>2023-04-29T16:50:35Z</updated>

		<summary type="html">&lt;p&gt;Sovago Rares-Andrei: /* Date de ieșire */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Cerinţa ==&lt;br /&gt;
La un campionat de șah participa &#039;&#039;&#039;n&#039;&#039;&#039; persoane. Știind că la fiecare rundă se fac grupe de câte &#039;&#039;&#039;2&#039;&#039;&#039; persoane, iar câștigătorul trece în runda următoare, aflați după câte runde se va află câștigătorul.&lt;br /&gt;
== Date de intrare ==&lt;br /&gt;
Programul citește de la tastatură numărul &#039;&#039;&#039;n&#039;&#039;&#039;.&lt;br /&gt;
== Date de ieșire == &lt;br /&gt;
Dacă datele sunt introduse corect, pe ecran: &lt;br /&gt;
&amp;quot;Datele sunt introduse corect.&amp;quot;,programul va afișa pe ecran numărul de runde. În cazul în care datele nu respectă restricțiile, se va afișa: &amp;quot;Datele nu corespund restricțiilor impuse.&amp;quot; iar pe un rând nou se va afișa &#039;&#039;&#039;-1&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
== Restricţii şi precizări ==&lt;br /&gt;
*n ≤ 4.444.444.444&lt;br /&gt;
*Dacă nu se poate realiza campionatul în conformitate cu regulile de mai sus, se va afișa -1.&lt;br /&gt;
&lt;br /&gt;
== Exemple ==&lt;br /&gt;
===Exemplul 1===&lt;br /&gt;
; &#039;&#039;Intrare&#039;&#039;&lt;br /&gt;
:4&lt;br /&gt;
; &#039;&#039;Ieșire&#039;&#039;&lt;br /&gt;
:Datele sunt introduse corect.&lt;br /&gt;
:2&lt;br /&gt;
===Exemplul 2===&lt;br /&gt;
; &#039;&#039;Intrare&#039;&#039;&lt;br /&gt;
:2&lt;br /&gt;
; &#039;&#039;Ieșire&#039;&#039;&lt;br /&gt;
:Datele sunt introduse corect.&lt;br /&gt;
:1&lt;br /&gt;
===Exemplul 3===&lt;br /&gt;
; &#039;&#039;Intrare&#039;&#039;&lt;br /&gt;
:5555555555&lt;br /&gt;
; &#039;&#039;Ieșire&#039;&#039;&lt;br /&gt;
:Datele nu corespund restricțiilor impuse.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Rezolvare == &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
# 2326 - Campionat&lt;br /&gt;
def validare_date(n):&lt;br /&gt;
    return 2 &amp;lt;= n &amp;lt;= 4444444444&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def rezolvare(n):&lt;br /&gt;
    if n % 2 == 1:&lt;br /&gt;
        return -1&lt;br /&gt;
    else:&lt;br /&gt;
        runde = 0&lt;br /&gt;
        while n &amp;gt; 1:&lt;br /&gt;
            n //= 2&lt;br /&gt;
            runde += 1&lt;br /&gt;
        return runde&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
if __name__ == &#039;__main__&#039;:&lt;br /&gt;
    n = int(input(&amp;quot;Introduceți numărul de persoane participante: &amp;quot;))&lt;br /&gt;
    if validare_date(n):&lt;br /&gt;
        print(&amp;quot;Datele sunt introduse corect.&amp;quot;)&lt;br /&gt;
        numar_runde = rezolvare(n)&lt;br /&gt;
        if numar_runde == -1:&lt;br /&gt;
            print(&amp;quot;-1&amp;quot;)&lt;br /&gt;
        else:&lt;br /&gt;
            print(numar_runde)&lt;br /&gt;
    else:&lt;br /&gt;
        print(&amp;quot;Datele nu corespund restricțiilor impuse.&amp;quot;)&lt;br /&gt;
        print(&amp;quot;-1&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==Explicatie==&lt;br /&gt;
Funcția validare_date(n): Această funcție primește un număr întreg n și verifică dacă acesta se încadrează în intervalul [2, 4444444444], astfel încât să respecte cerințele problemei. Dacă n este valid, funcția returnează True, altfel returnează False.&lt;br /&gt;
&lt;br /&gt;
Funcția rezolvare(n): Această funcție primește un număr întreg n și calculează numărul de runde necesare pentru ca toate cele n persoane să joace jocul &amp;quot;The Game of Threes&amp;quot;. Regulile jocului sunt următoarele:&lt;br /&gt;
&lt;br /&gt;
Dacă numărul n este divizibil cu 3, împarte-l la 3.&lt;br /&gt;
Dacă n + 1 este divizibil cu 3, adună 1 la n și împarte rezultatul la 3.&lt;br /&gt;
Dacă n - 1 este divizibil cu 3, scade 1 din n și împarte rezultatul la 3.&lt;br /&gt;
Jocul se termină când n devine 1. Funcția returnează numărul de runde necesare pentru a ajunge la 1 sau -1 dacă n nu poate fi redus la 1.&lt;br /&gt;
&lt;br /&gt;
Blocul if __name__ == &#039;__main__&#039;:: Acest bloc verifică dacă acest script este rulat direct ca fișier executabil sau a fost importat în alt modul Python. În cazul în care acesta este rulat direct, atunci se solicită utilizatorului să introducă numărul de persoane participante n și se validează acest număr folosind funcția validare_date. Dacă numărul este valid, atunci se calculează numărul de runde necesare folosind funcția rezolvare și se afișează pe ecran. Dacă numărul nu este valid, atunci se afișează un mesaj de eroare și se afișează -1.&lt;/div&gt;</summary>
		<author><name>Sovago Rares-Andrei</name></author>
	</entry>
	<entry>
		<id>https://wiki.universitas.ro/index.php?title=2969_-_Cauta_Fibo&amp;diff=5522</id>
		<title>2969 - Cauta Fibo</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=2969_-_Cauta_Fibo&amp;diff=5522"/>
		<updated>2023-04-29T16:49:00Z</updated>

		<summary type="html">&lt;p&gt;Sovago Rares-Andrei: /* Rezolvare */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Cerinţa ==&lt;br /&gt;
Se citesc pe rând numere naturale nenule. Să se determine câte din numerele citite sunt termeni ai șirului lui &#039;&#039;&#039;Fibonacci&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
== Date de intrare ==&lt;br /&gt;
Fișierul de intrare &#039;&#039;&#039;cautafibo.in&#039;&#039;&#039; conține numere naturale nenule, separate prin spații.&lt;br /&gt;
== Date de ieșire == &lt;br /&gt;
Dacă datele sunt introduse corect, pe ecran: &lt;br /&gt;
&amp;quot;Datele sunt introduse corect.&amp;quot;,fișierul de ieșire &#039;&#039;&#039;cautafibo.out&#039;&#039;&#039; va conține o singură valoare, reprezentând numărul termenilor Fibonacci care se regăsesc în fișierul de intrare. În cazul în care datele nu respectă restricțiile, se va afișa: &amp;quot;Datele nu corespund restricțiilor impuse.&amp;quot;.&lt;br /&gt;
== Restricţii şi precizări ==&lt;br /&gt;
*numerele din fișierul de intrare vor avea cel mult 10 cifre&lt;br /&gt;
*fișierul de intrare va conține cel mult 100.000 de numere naturale nenule&lt;br /&gt;
&lt;br /&gt;
== Exemple ==&lt;br /&gt;
===Exemplul 1===&lt;br /&gt;
; &#039;&#039;cautafibo.in&#039;&#039;&lt;br /&gt;
:5 10 89 1 7 9 8 1 6 55 19 13 55&lt;br /&gt;
; &#039;&#039;ecran&#039;&#039;&lt;br /&gt;
:Datele sunt introduse corect.&lt;br /&gt;
; &#039;&#039;cautafibo.out&#039;&#039;&lt;br /&gt;
:8&lt;br /&gt;
===Exemplul 2===&lt;br /&gt;
; &#039;&#039;cautafibo.in&#039;&#039;&lt;br /&gt;
:1 3 5 8 13 21 34 55 89 144&lt;br /&gt;
; &#039;&#039;ecran&#039;&#039;&lt;br /&gt;
:Datele sunt introduse corect.&lt;br /&gt;
; &#039;&#039;cautafibo.out&#039;&#039;&lt;br /&gt;
:10&lt;br /&gt;
===Exemplul 3===&lt;br /&gt;
; &#039;&#039;cautafibo.in&#039;&#039;&lt;br /&gt;
:-5 2 7 9 11 13 15&lt;br /&gt;
; &#039;&#039;ecran&#039;&#039;&lt;br /&gt;
:Datele nu corespund restricțiilor impuse.&lt;br /&gt;
; &#039;&#039;cautafibo.out&#039;&#039;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Rezolvare == &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
# 2969 - Cauta Fibo &lt;br /&gt;
import sys&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def este_valid(fisier_intrare):&lt;br /&gt;
    try:&lt;br /&gt;
        with open(fisier_intrare, &#039;r&#039;) as f:&lt;br /&gt;
            for line in f:&lt;br /&gt;
                nums = line.strip().split()&lt;br /&gt;
                for num in nums:&lt;br /&gt;
                    if not num.isnumeric() or int(num) &amp;lt; 1 or len(num) &amp;gt; 10:&lt;br /&gt;
                        print(&amp;quot;Datele nu corespund restricțiilor impuse.&amp;quot;)&lt;br /&gt;
                        sys.exit(0)&lt;br /&gt;
        print(&amp;quot;Datele sunt introduse corect.&amp;quot;)&lt;br /&gt;
        return True&lt;br /&gt;
    except:&lt;br /&gt;
        sys.exit(0)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def rezolva(fisier_intrare):&lt;br /&gt;
    with open(fisier_intrare, &#039;r&#039;) as f, open(&#039;cautafibo.out&#039;, &#039;w&#039;) as g:&lt;br /&gt;
        a = [1, 1]&lt;br /&gt;
        while a[-1] &amp;lt;= 10000000001:&lt;br /&gt;
            a.append(a[-1] + a[-2])&lt;br /&gt;
        cnt = 0&lt;br /&gt;
        for line in f:&lt;br /&gt;
            nums = line.strip().split()&lt;br /&gt;
            for num in nums:&lt;br /&gt;
                x = int(num)&lt;br /&gt;
                poz = -1&lt;br /&gt;
                st, dr = 0, len(a) - 1&lt;br /&gt;
                while st &amp;lt;= dr:&lt;br /&gt;
                    m = (st + dr) // 2&lt;br /&gt;
                    if x &amp;lt;= a[m]:&lt;br /&gt;
                        poz = m&lt;br /&gt;
                        dr = m - 1&lt;br /&gt;
                    else:&lt;br /&gt;
                        st = m + 1&lt;br /&gt;
                if a[poz] == x:&lt;br /&gt;
                    cnt += 1&lt;br /&gt;
        g.write(str(cnt))&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
if __name__ == &#039;__main__&#039;:&lt;br /&gt;
    fisier_intrare = &#039;cautafibo.in&#039;&lt;br /&gt;
    este_valid(fisier_intrare)&lt;br /&gt;
    rezolva(fisier_intrare)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Explicatie==&lt;br /&gt;
Funcția este_valid(fisier_intrare) primește ca parametru calea către un fișier de intrare și verifică dacă datele din fișier respectă restricțiile impuse. Mai precis, citind fiecare linie din fișier, verifică dacă fiecare număr este numeric, are o lungime maximă de 10 caractere și este mai mare sau egal cu 1. Dacă datele din fișier sunt valide, funcția returnează True, altfel returnează False. În plus, funcția afișează mesajul &amp;quot;Datele sunt introduse corect.&amp;quot; sau &amp;quot;Datele nu corespund restricțiilor impuse.&amp;quot; în funcție de validitatea datelor.&lt;br /&gt;
&lt;br /&gt;
Funcția rezolva(fisier_intrare) primește ca parametru calea către un fișier de intrare și citește datele din fișier, găsind numărul de numere din fișier care sunt în șirul lui Fibonacci. Pentru a face acest lucru, inițializează șirul lui Fibonacci până la 10000000001, apoi pentru fiecare număr din fișier, folosește o căutare binară în șirul lui Fibonacci pentru a determina dacă acesta se află în șir. Dacă se află, numărul de numere găsite este incrementat. La final, funcția scrie numărul de numere găsite în fișierul &amp;quot;cautafibo.out&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Blocul if __name__ == &#039;__main__&#039;: este folosit pentru a verifica dacă scriptul este rulat ca fișier principal. În cazul în care este rulat ca fișier principal, acesta va apela funcțiile este_valid(fisier_intrare) și rezolva(fisier_intrare) cu fișierul de intrare specificat în codul sursă. Dacă datele sunt valide, funcția rezolva(fisier_intrare) va fi apelată pentru a procesa datele și a scrie rezultatul în fișierul &amp;quot;cautafibo.out&amp;quot;. Dacă datele nu sunt valide, programul se va încheia cu sys.exit(0) și nu va ajunge la apelarea funcției rezolva(fisier_intrare)&lt;/div&gt;</summary>
		<author><name>Sovago Rares-Andrei</name></author>
	</entry>
	<entry>
		<id>https://wiki.universitas.ro/index.php?title=2969_-_Cauta_Fibo&amp;diff=5521</id>
		<title>2969 - Cauta Fibo</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=2969_-_Cauta_Fibo&amp;diff=5521"/>
		<updated>2023-04-29T16:48:25Z</updated>

		<summary type="html">&lt;p&gt;Sovago Rares-Andrei: /* Cerinţa */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Cerinţa ==&lt;br /&gt;
Se citesc pe rând numere naturale nenule. Să se determine câte din numerele citite sunt termeni ai șirului lui &#039;&#039;&#039;Fibonacci&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
== Date de intrare ==&lt;br /&gt;
Fișierul de intrare &#039;&#039;&#039;cautafibo.in&#039;&#039;&#039; conține numere naturale nenule, separate prin spații.&lt;br /&gt;
== Date de ieșire == &lt;br /&gt;
Dacă datele sunt introduse corect, pe ecran: &lt;br /&gt;
&amp;quot;Datele sunt introduse corect.&amp;quot;,fișierul de ieșire &#039;&#039;&#039;cautafibo.out&#039;&#039;&#039; va conține o singură valoare, reprezentând numărul termenilor Fibonacci care se regăsesc în fișierul de intrare. În cazul în care datele nu respectă restricțiile, se va afișa: &amp;quot;Datele nu corespund restricțiilor impuse.&amp;quot;.&lt;br /&gt;
== Restricţii şi precizări ==&lt;br /&gt;
*numerele din fișierul de intrare vor avea cel mult 10 cifre&lt;br /&gt;
*fișierul de intrare va conține cel mult 100.000 de numere naturale nenule&lt;br /&gt;
&lt;br /&gt;
== Exemple ==&lt;br /&gt;
===Exemplul 1===&lt;br /&gt;
; &#039;&#039;cautafibo.in&#039;&#039;&lt;br /&gt;
:5 10 89 1 7 9 8 1 6 55 19 13 55&lt;br /&gt;
; &#039;&#039;ecran&#039;&#039;&lt;br /&gt;
:Datele sunt introduse corect.&lt;br /&gt;
; &#039;&#039;cautafibo.out&#039;&#039;&lt;br /&gt;
:8&lt;br /&gt;
===Exemplul 2===&lt;br /&gt;
; &#039;&#039;cautafibo.in&#039;&#039;&lt;br /&gt;
:1 3 5 8 13 21 34 55 89 144&lt;br /&gt;
; &#039;&#039;ecran&#039;&#039;&lt;br /&gt;
:Datele sunt introduse corect.&lt;br /&gt;
; &#039;&#039;cautafibo.out&#039;&#039;&lt;br /&gt;
:10&lt;br /&gt;
===Exemplul 3===&lt;br /&gt;
; &#039;&#039;cautafibo.in&#039;&#039;&lt;br /&gt;
:-5 2 7 9 11 13 15&lt;br /&gt;
; &#039;&#039;ecran&#039;&#039;&lt;br /&gt;
:Datele nu corespund restricțiilor impuse.&lt;br /&gt;
; &#039;&#039;cautafibo.out&#039;&#039;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Rezolvare == &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
# 2827 - Sir 12&lt;br /&gt;
import sys&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def este_valid(fisier_intrare):&lt;br /&gt;
    try:&lt;br /&gt;
        with open(fisier_intrare, &#039;r&#039;) as f:&lt;br /&gt;
            for line in f:&lt;br /&gt;
                nums = line.strip().split()&lt;br /&gt;
                for num in nums:&lt;br /&gt;
                    if not num.isnumeric() or int(num) &amp;lt; 1 or len(num) &amp;gt; 10:&lt;br /&gt;
                        print(&amp;quot;Datele nu corespund restricțiilor impuse.&amp;quot;)&lt;br /&gt;
                        sys.exit(0)&lt;br /&gt;
        print(&amp;quot;Datele sunt introduse corect.&amp;quot;)&lt;br /&gt;
        return True&lt;br /&gt;
    except:&lt;br /&gt;
        sys.exit(0)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def rezolva(fisier_intrare):&lt;br /&gt;
    with open(fisier_intrare, &#039;r&#039;) as f, open(&#039;cautafibo.out&#039;, &#039;w&#039;) as g:&lt;br /&gt;
        a = [1, 1]&lt;br /&gt;
        while a[-1] &amp;lt;= 10000000001:&lt;br /&gt;
            a.append(a[-1] + a[-2])&lt;br /&gt;
        cnt = 0&lt;br /&gt;
        for line in f:&lt;br /&gt;
            nums = line.strip().split()&lt;br /&gt;
            for num in nums:&lt;br /&gt;
                x = int(num)&lt;br /&gt;
                poz = -1&lt;br /&gt;
                st, dr = 0, len(a) - 1&lt;br /&gt;
                while st &amp;lt;= dr:&lt;br /&gt;
                    m = (st + dr) // 2&lt;br /&gt;
                    if x &amp;lt;= a[m]:&lt;br /&gt;
                        poz = m&lt;br /&gt;
                        dr = m - 1&lt;br /&gt;
                    else:&lt;br /&gt;
                        st = m + 1&lt;br /&gt;
                if a[poz] == x:&lt;br /&gt;
                    cnt += 1&lt;br /&gt;
        g.write(str(cnt))&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
if __name__ == &#039;__main__&#039;:&lt;br /&gt;
    fisier_intrare = &#039;cautafibo.in&#039;&lt;br /&gt;
    este_valid(fisier_intrare)&lt;br /&gt;
    rezolva(fisier_intrare)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Explicatie==&lt;br /&gt;
Funcția este_valid(fisier_intrare) primește ca parametru calea către un fișier de intrare și verifică dacă datele din fișier respectă restricțiile impuse. Mai precis, citind fiecare linie din fișier, verifică dacă fiecare număr este numeric, are o lungime maximă de 10 caractere și este mai mare sau egal cu 1. Dacă datele din fișier sunt valide, funcția returnează True, altfel returnează False. În plus, funcția afișează mesajul &amp;quot;Datele sunt introduse corect.&amp;quot; sau &amp;quot;Datele nu corespund restricțiilor impuse.&amp;quot; în funcție de validitatea datelor.&lt;br /&gt;
&lt;br /&gt;
Funcția rezolva(fisier_intrare) primește ca parametru calea către un fișier de intrare și citește datele din fișier, găsind numărul de numere din fișier care sunt în șirul lui Fibonacci. Pentru a face acest lucru, inițializează șirul lui Fibonacci până la 10000000001, apoi pentru fiecare număr din fișier, folosește o căutare binară în șirul lui Fibonacci pentru a determina dacă acesta se află în șir. Dacă se află, numărul de numere găsite este incrementat. La final, funcția scrie numărul de numere găsite în fișierul &amp;quot;cautafibo.out&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Blocul if __name__ == &#039;__main__&#039;: este folosit pentru a verifica dacă scriptul este rulat ca fișier principal. În cazul în care este rulat ca fișier principal, acesta va apela funcțiile este_valid(fisier_intrare) și rezolva(fisier_intrare) cu fișierul de intrare specificat în codul sursă. Dacă datele sunt valide, funcția rezolva(fisier_intrare) va fi apelată pentru a procesa datele și a scrie rezultatul în fișierul &amp;quot;cautafibo.out&amp;quot;. Dacă datele nu sunt valide, programul se va încheia cu sys.exit(0) și nu va ajunge la apelarea funcției rezolva(fisier_intrare)&lt;/div&gt;</summary>
		<author><name>Sovago Rares-Andrei</name></author>
	</entry>
	<entry>
		<id>https://wiki.universitas.ro/index.php?title=2206_-_Min_Impar&amp;diff=5519</id>
		<title>2206 - Min Impar</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=2206_-_Min_Impar&amp;diff=5519"/>
		<updated>2023-04-29T16:46:44Z</updated>

		<summary type="html">&lt;p&gt;Sovago Rares-Andrei: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Cerinţa ==&lt;br /&gt;
Se dă un număr &#039;&#039;&#039;X&#039;&#039;&#039;. Să se afle cel mai mic număr &#039;&#039;&#039;Y ≥ X&#039;&#039;&#039; cu proprietatea că &#039;&#039;&#039;Y&#039;&#039;&#039; are doar cifre impare.&lt;br /&gt;
== Date de intrare ==&lt;br /&gt;
Programul citește de la tastatură numărul &#039;&#039;&#039;X&#039;&#039;&#039;.&lt;br /&gt;
== Date de ieșire == &lt;br /&gt;
Dacă datele sunt introduse corect, pe ecran: &lt;br /&gt;
&amp;quot;Datele sunt introduse corect.&amp;quot;,programul va afișa pe ecran numărul &#039;&#039;&#039;Y&#039;&#039;&#039;. În cazul în care datele nu respectă restricțiile, se va afișa: &amp;quot;Datele nu corespund restricțiilor impuse.&amp;quot;.&lt;br /&gt;
== Restricţii şi precizări ==&lt;br /&gt;
*1 ≤ X ≤ 10^18&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
== Exemple ==&lt;br /&gt;
===Exemplul 1===&lt;br /&gt;
; &#039;&#039;Intrare&#039;&#039;&lt;br /&gt;
:22&lt;br /&gt;
; &#039;&#039;Ieșire&#039;&#039;&lt;br /&gt;
:31&lt;br /&gt;
===Exemplul 2===&lt;br /&gt;
; &#039;&#039;Intrare&#039;&#039;&lt;br /&gt;
:10&lt;br /&gt;
; &#039;&#039;Ieșire&#039;&#039;&lt;br /&gt;
:11&lt;br /&gt;
===Exemplul 3===&lt;br /&gt;
; &#039;&#039;Intrare&#039;&#039;&lt;br /&gt;
:-2&lt;br /&gt;
; &#039;&#039;Ieșire&#039;&#039;&lt;br /&gt;
:Datele nu corespund restricțiilor impuse.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Rezolvare == &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
# 2206 - Min Impar&lt;br /&gt;
def validare_date(x: int) -&amp;gt; bool:&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    Verifică dacă datele de intrare sunt valide conform cerințelor.&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    return 1 &amp;lt;= x &amp;lt;= 10 ** 18&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def gaseste_numar_imp(x: int) -&amp;gt; int:&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    Găsește cel mai mic număr Y ≥ X cu proprietatea că Y are doar cifre impare.&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    while True:&lt;br /&gt;
        if all(int(d) % 2 == 1 for d in str(x)):&lt;br /&gt;
            return x&lt;br /&gt;
        x += 1&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
if __name__ == &#039;__main__&#039;:&lt;br /&gt;
    x = int(input(&amp;quot;Introduceți numărul X: &amp;quot;))&lt;br /&gt;
    if not validare_date(x):&lt;br /&gt;
        print(&amp;quot;Datele nu corespund restricțiilor impuse.&amp;quot;)&lt;br /&gt;
        exit()&lt;br /&gt;
    print(&amp;quot;Datele sunt introduse corect.&amp;quot;)&lt;br /&gt;
    y = gaseste_numar_imp(x)&lt;br /&gt;
    print(y)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Explicatie==&lt;br /&gt;
Funcția validare_date(x: int) -&amp;gt; bool: Această funcție verifică dacă numărul x primit ca argument se încadrează în intervalul [1, 10^18] și returnează True dacă acesta este valid și False altfel. Astfel, această funcție este folosită pentru a valida datele de intrare înainte de a executa funcția gaseste_numar_imp.&lt;br /&gt;
&lt;br /&gt;
Funcția gaseste_numar_imp(x: int) -&amp;gt; int: Această funcție primește un număr x și începe să-l mărească treptat până când găsește cel mai mic număr Y care are doar cifre impare și Y este mai mare sau egal cu X. În fiecare iterație, funcția verifică dacă toate cifrele numărului curent sunt impare. Dacă este așa, atunci funcția returnează numărul curent, altfel continuă să-l mărească pe x cu o unitate și să reia verificarea.&lt;br /&gt;
&lt;br /&gt;
Blocul if __name__ == &#039;__main__&#039;:: Acest bloc verifică dacă acest script este rulat direct ca fișier executabil sau a fost importat în alt modul Python. În cazul în care acesta este rulat direct, atunci se solicită utilizatorului să introducă un număr întreg x și se validează acest număr folosind funcția validare_date. Dacă numărul este valid, atunci se calculează cel mai mic număr Y care are doar cifre impare și este mai mare sau egal cu X, folosind funcția gaseste_numar_imp. În cele din urmă, numărul Y este afișat pe ecran.&lt;/div&gt;</summary>
		<author><name>Sovago Rares-Andrei</name></author>
	</entry>
	<entry>
		<id>https://wiki.universitas.ro/index.php?title=2796_-_Secvente_Neuniforme&amp;diff=5518</id>
		<title>2796 - Secvente Neuniforme</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=2796_-_Secvente_Neuniforme&amp;diff=5518"/>
		<updated>2023-04-29T16:44:42Z</updated>

		<summary type="html">&lt;p&gt;Sovago Rares-Andrei: /* Date de intrare */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Cerinţa ==&lt;br /&gt;
Numim &#039;&#039;&#039;secvență neuniformă&#039;&#039;&#039; a unui șir de numere naturale un subșir al acestuia, format din termeni aflați pe poziții consecutive în șirul dat, cu proprietatea că oricare trei termeni aflați pe poziții consecutive sunt diferiți. Lungimea secvenței este egală cu numărul de termeni ai acesteia.&lt;br /&gt;
&lt;br /&gt;
Se dă un șir de cel mult &#039;&#039;&#039;10^6&#039;&#039;&#039; numere naturale din intervalul &#039;&#039;&#039;[0,9]&#039;&#039;&#039;, în care există cel puțin trei termeni diferiți pe poziții consecutive. Se cere să se afișeze lungimea maximă a unei secvențe neuniforme a șirului dat.&lt;br /&gt;
== Date de intrare ==&lt;br /&gt;
Fișierul de intrare &#039;&#039;&#039;secventeneuniforme.in&#039;&#039;&#039; conține un șir de cel mult &#039;&#039;&#039;10^6&#039;&#039;&#039; numere naturale din intervalul &#039;&#039;&#039;[0,9]&#039;&#039;&#039; separate prin spații.&lt;br /&gt;
&lt;br /&gt;
== Date de ieșire == &lt;br /&gt;
Dacă datele sunt introduse corect, pe ecran: &lt;br /&gt;
&amp;quot;Datele sunt introduse corect.&amp;quot;,fișierul de ieșire &#039;&#039;&#039;secventeneuniforme.out&#039;&#039;&#039; va conține pe prima linie lungimea maximă a unei secvențe neuniforme a șirului aflat în fișierul de intrare. În cazul în care datele nu respectă restricțiile, se va afișa: &amp;quot;Datele nu corespund restricțiilor impuse.&amp;quot;.&lt;br /&gt;
== Restricţii şi precizări =&lt;br /&gt;
*Proiectați un algoritm eficient din punctul de vedere al spațiului de memorie utilizat şi al timpului de executare:&lt;br /&gt;
*se recomandă o soluție care să nu memoreze elementele șirului într-un tablou sau altă structură de date similară.&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
== Exemple ==&lt;br /&gt;
===Exemplul 1===&lt;br /&gt;
; &#039;&#039;secventapara.in&#039;&#039;&lt;br /&gt;
:7 7 1 3 7 7 5 3 3 3 7 8 9&lt;br /&gt;
; &#039;&#039;Ecran&#039;&#039;&lt;br /&gt;
: Datele sunt introduse corect.&lt;br /&gt;
; &#039;&#039;secventapara.out&#039;&#039;&lt;br /&gt;
:4&lt;br /&gt;
=== Exemplul 2 ===&lt;br /&gt;
; &#039;&#039;secventeneuniforme.in&#039;&#039;&lt;br /&gt;
:2 2 2 2 2 2 2 2 2 2 2 2 2&lt;br /&gt;
; &#039;&#039;Ecran&#039;&#039;&lt;br /&gt;
: Datele nu corespund restricțiilor impuse.&lt;br /&gt;
; &#039;&#039;secventeneuniforme.out&#039;&#039;&lt;br /&gt;
:0&lt;br /&gt;
=== Exemplul 3 ===&lt;br /&gt;
; &#039;&#039;secventeneuniforme.in&#039;&#039;&lt;br /&gt;
:1 1 1 2 3 3 3 3 3 3 2 2 2 1 1 1 2 2 2 2&lt;br /&gt;
; &#039;&#039;Ecran&#039;&#039;&lt;br /&gt;
: Datele sunt introduse corect.&lt;br /&gt;
; &#039;&#039;secventeneuniforme.out&#039;&#039;&lt;br /&gt;
:3&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Rezolvare == &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
# 2796 - Secvente Neuniforme&lt;br /&gt;
def validare_date_intrare(sir):&lt;br /&gt;
    &#039;&#039;&#039;&lt;br /&gt;
    Verifică dacă datele din fișierul de intrare corespund cerințelor impuse.&lt;br /&gt;
    &#039;&#039;&#039;&lt;br /&gt;
    if len(sir) == 0:&lt;br /&gt;
        return False&lt;br /&gt;
    for i in range(len(sir) - 2):&lt;br /&gt;
        if sir[i] != sir[i + 1] and sir[i + 1] != sir[i + 2] and sir[i] != sir[i + 2]:&lt;br /&gt;
            return True&lt;br /&gt;
    return False&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def rezolvare(sir):&lt;br /&gt;
    &#039;&#039;&#039;&lt;br /&gt;
    Găsește lungimea maximă a unei secvențe neuniforme în șirul dat.&lt;br /&gt;
    &#039;&#039;&#039;&lt;br /&gt;
    lungime_maxima = 0&lt;br /&gt;
    lungime_curenta = 0&lt;br /&gt;
    for i in range(len(sir) - 2):&lt;br /&gt;
        if sir[i] != sir[i + 1] and sir[i + 1] != sir[i + 2] and sir[i] != sir[i + 2]:&lt;br /&gt;
            lungime_curenta += 1&lt;br /&gt;
        else:&lt;br /&gt;
            if lungime_curenta &amp;gt; lungime_maxima:&lt;br /&gt;
                lungime_maxima = lungime_curenta&lt;br /&gt;
            lungime_curenta = 0&lt;br /&gt;
    if lungime_curenta &amp;gt; lungime_maxima:&lt;br /&gt;
        lungime_maxima = lungime_curenta&lt;br /&gt;
    return lungime_maxima + 2&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
if __name__ == &#039;__main__&#039;:&lt;br /&gt;
    # Citim datele din fișierul de intrare&lt;br /&gt;
    with open(&#039;secventapara.in&#039;, &#039;r&#039;) as f:&lt;br /&gt;
        sir = list(map(int, f.readline().split()))&lt;br /&gt;
&lt;br /&gt;
    # Validăm datele de intrare&lt;br /&gt;
    if not validare_date_intrare(sir):&lt;br /&gt;
        print(&amp;quot;Datele nu corespund restricțiilor impuse.&amp;quot;)&lt;br /&gt;
        exit()&lt;br /&gt;
&lt;br /&gt;
    # Rezolvăm problema și afișăm rezultatul&lt;br /&gt;
    lungime_maxima = rezolvare(sir)&lt;br /&gt;
    # Scriem rezultatul în fișierul de ieșire&lt;br /&gt;
    with open(&#039;secventeneuniforme.out&#039;, &#039;w&#039;) as f:&lt;br /&gt;
        print(&amp;quot;Datele sunt introduse corect.&amp;quot;)&lt;br /&gt;
        f.write(str(lungime_maxima))&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Explicatie==&lt;br /&gt;
Funcția validare_date_intrare(sir) verifică dacă datele din fișierul de intrare corespund cerințelor impuse, adică există cel puțin o secvență de cel puțin trei numere consecutive în care niciunul dintre ele nu este egal cu niciunul dintre celelalte două. Dacă există cel puțin o astfel de secvență, funcția returnează True, altfel returnează False.&lt;br /&gt;
&lt;br /&gt;
Funcția rezolvare(sir) primește un șir de numere și încearcă să găsească lungimea maximă a unei secvențe neuniforme din acesta. Pentru a face acest lucru, funcția parcurge lista și numără lungimea fiecărei secvențe de cel puțin trei numere consecutive în care niciunul dintre ele nu este egal cu niciunul dintre celelalte două. Dacă lungimea unei astfel de secvențe este mai mare decât lungimea maximă găsită până acum, atunci se actualizează lungimea maximă.&lt;br /&gt;
&lt;br /&gt;
În blocul if __name__ == &#039;__main__&#039;: citim datele de intrare din fișierul &amp;quot;secventapara.in&amp;quot; și apoi verificăm dacă datele sunt valide folosind funcția validare_date_intrare(sir). Dacă datele nu sunt valide, se afișează un mesaj corespunzător și se oprește execuția programului.&lt;br /&gt;
&lt;br /&gt;
Dacă datele sunt valide, se apelează funcția rezolvare(sir) pentru a găsi lungimea maximă a unei secvențe neuniforme și se afișează în consolă mesajul &amp;quot;Datele sunt introduse corect.&amp;quot;. În plus, se scrie lungimea maximă a secvenței neuniforme găsite în fișierul de ieșire &amp;quot;secventeneuniforme.out&amp;quot;.&lt;/div&gt;</summary>
		<author><name>Sovago Rares-Andrei</name></author>
	</entry>
	<entry>
		<id>https://wiki.universitas.ro/index.php?title=2806_-_Secventa_Para&amp;diff=5517</id>
		<title>2806 - Secventa Para</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=2806_-_Secventa_Para&amp;diff=5517"/>
		<updated>2023-04-29T16:44:01Z</updated>

		<summary type="html">&lt;p&gt;Sovago Rares-Andrei: /* Exemplul 3 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Cerinţa ==&lt;br /&gt;
Numim &#039;&#039;&#039;secvență pară&#039;&#039;&#039; într-un șir o succesiune de termeni ai șirului cu proprietatea că sunt numere pare și că se află pe poziții consecutive în șir; orice secvență are cel puțin doi termeni și este maximală în raport cu proprietatea precizată (dacă i se adaugă un alt termen, secvența își pierde această proprietate). Lungimea secvenței este egală cu numărul termenilor săi.&lt;br /&gt;
&lt;br /&gt;
Scrieți un program care citește un șir de cel mult &#039;&#039;&#039;10^6&#039;&#039;&#039; numere naturale din intervalul &#039;&#039;&#039;[0,10^9]&#039;&#039;&#039; și determină numărul de secvențe pare de lungime maximă din șir.&lt;br /&gt;
Se cere să se afișeze poziția din al doilea șir începând de la care poate fi inserat primul șir, astfel încât șirul obținut să fie strict crescător. Dacă nu există o astfel de poziție, se afișează mesajul &#039;&#039;&#039;imposibil&#039;&#039;&#039;.&lt;br /&gt;
== Date de intrare ==&lt;br /&gt;
Fișierul de intrare &#039;&#039;&#039;secventapara.in&#039;&#039;&#039; conține cel mult &#039;&#039;&#039;10^6&#039;&#039;&#039; numere naturale din intervalul &#039;&#039;&#039;[0,10^9]&#039;&#039;&#039;, separate prin spații.&lt;br /&gt;
== Date de ieșire == &lt;br /&gt;
Dacă datele sunt introduse corect, pe ecran: &lt;br /&gt;
&amp;quot;Datele sunt introduse corect.&amp;quot;,fișierul de ieșire &#039;&#039;&#039;secventapara.out&#039;&#039;&#039; va conține pe prima linie numărul de secvențe pare de lungime maximă din șir. În cazul în care datele nu respectă restricțiile, se va afișa: &amp;quot;Datele nu corespund restricțiilor impuse.&amp;quot;&lt;br /&gt;
== Restricţii şi precizări ==&lt;br /&gt;
*Proiectați un algoritm eficient din punctul de vedere al spațiului de memorie utilizat şi al timpului de executare:&lt;br /&gt;
*se recomandă o soluție care să nu memoreze elementele șirului într-un tablou sau altă structură de date similară.&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
== Exemple ==&lt;br /&gt;
===Exemplul 1===&lt;br /&gt;
; &#039;&#039;secventapara.in&#039;&#039;&lt;br /&gt;
:1 2 3 4 6 10 2 8 5 7 9 4 6 10 121 20 4 11 10 2 5 2 6 8 10 16&lt;br /&gt;
; &#039;&#039;Ecran&#039;&#039;&lt;br /&gt;
: Datele sunt introduse corect.&lt;br /&gt;
; &#039;&#039;secventapara.out&#039;&#039;&lt;br /&gt;
:2&lt;br /&gt;
=== Exemplul 2 ===&lt;br /&gt;
&#039;&#039;secventapara.in&#039;&#039;:&lt;br /&gt;
:1 3 5 7 9&lt;br /&gt;
; &#039;&#039;Ecran&#039;&#039;&lt;br /&gt;
: Datele sunt introduse corect.&lt;br /&gt;
;&#039;&#039;secventapara.out&#039;&#039;:&lt;br /&gt;
:0&lt;br /&gt;
=== Exemplul 3 ===&lt;br /&gt;
;&#039;&#039;secventapara.in&#039;&#039;:&lt;br /&gt;
:2 -4 6 8 10&lt;br /&gt;
; &#039;&#039;Ecran&#039;&#039;&lt;br /&gt;
: Datele nu corespund restricțiilor impuse.&lt;br /&gt;
; &#039;&#039;secventapara.out&#039;&#039;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Rezolvare == &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
# 2806 - Secventa Para&lt;br /&gt;
def validare_date(sir):&lt;br /&gt;
    if len(sir) &amp;gt; 10**6 or any(num &amp;lt; 0 or num &amp;gt; 10**9 for num in sir):&lt;br /&gt;
        print(&amp;quot;Datele nu corespund restricțiilor impuse.&amp;quot;)&lt;br /&gt;
        return False&lt;br /&gt;
    else:&lt;br /&gt;
        print(&amp;quot;Datele sunt introduse corect.&amp;quot;)&lt;br /&gt;
        return True&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def numar_si_lungime_maxima_secvente_pare(sir):&lt;br /&gt;
    lungime_maxima = 0&lt;br /&gt;
    lungime_curenta = 0&lt;br /&gt;
    numar_secvente_maxime = 0&lt;br /&gt;
&lt;br /&gt;
    for num in sir:&lt;br /&gt;
        if num % 2 == 0:&lt;br /&gt;
            lungime_curenta += 1&lt;br /&gt;
            if lungime_curenta &amp;gt; lungime_maxima:&lt;br /&gt;
                lungime_maxima = lungime_curenta&lt;br /&gt;
                numar_secvente_maxime = 1&lt;br /&gt;
            elif lungime_curenta == lungime_maxima:&lt;br /&gt;
                numar_secvente_maxime += 1&lt;br /&gt;
        else:&lt;br /&gt;
            lungime_curenta = 0&lt;br /&gt;
&lt;br /&gt;
    return numar_secvente_maxime, lungime_maxima&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
if __name__ == &#039;__main__&#039;:&lt;br /&gt;
    # Citire date din fisier&lt;br /&gt;
    with open(&amp;quot;secventapara.in&amp;quot;, &amp;quot;r&amp;quot;) as f:&lt;br /&gt;
        sir = list(map(int, f.readline().split()))&lt;br /&gt;
&lt;br /&gt;
    # Verificare validitate date de intrare&lt;br /&gt;
    if validare_date(sir):&lt;br /&gt;
        # Calcul numar si lungime maxima secvente pare&lt;br /&gt;
        numar_secvente_maxime, lungime_maxima = numar_si_lungime_maxima_secvente_pare(sir)&lt;br /&gt;
        # Afisare numar si lungime maxima secvente pare&lt;br /&gt;
        with open(&amp;quot;secventapara.out&amp;quot;, &amp;quot;w&amp;quot;) as g:&lt;br /&gt;
            g.write(str(numar_secvente_maxime) + &#039;\n&#039;)&lt;br /&gt;
            # g.write(str(lungime_maxima))&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Explicatie==&lt;br /&gt;
Funcția validare_date(sir) verifică dacă datele de intrare sunt valide, adică:&lt;br /&gt;
&lt;br /&gt;
lista are o lungime mai mică sau egală cu 10^6;&lt;br /&gt;
toți termenii din listă sunt numere întregi între 0 și 10^9.&lt;br /&gt;
Funcția returnează True dacă datele sunt valide și False în caz contrar. În plus, funcția afișează un mesaj corespunzător pentru a confirma validitatea datelor.&lt;br /&gt;
&lt;br /&gt;
Funcția numar_si_lungime_maxima_secvente_pare(sir) primește o listă de numere și încearcă să găsească numărul și lungimea maximă a secvențelor pare din acea listă. Pentru a face acest lucru, funcția parcurge lista și numără lungimea fiecărei secvențe de numere pare. Dacă lungimea unei secvențe este mai mare decât lungimea maximă găsită până acum, atunci se actualizează lungimea maximă și se resetează numărul de secvențe maximale. Dacă lungimea unei secvențe este egală cu lungimea maximă găsită până acum, atunci se adaugă o secvență suplimentară la numărul de secvențe maximale.&lt;br /&gt;
&lt;br /&gt;
Funcția returnează numărul de secvențe maximale și lungimea maximă a secvențelor pare.&lt;br /&gt;
&lt;br /&gt;
În blocul if __name__ == &#039;__main__&#039;: citim datele de intrare din fișierul &amp;quot;secventapara.in&amp;quot; și apoi verificăm dacă datele sunt valide folosind funcția validare_date(sir). Dacă datele nu sunt valide, se afișează un mesaj corespunzător și se oprește execuția programului.&lt;br /&gt;
&lt;br /&gt;
Dacă datele sunt valide, se apelează funcția numar_si_lungime_maxima_secvente_pare(sir) pentru a găsi numărul și lungimea maximă a secvențelor pare și se afișează în fișierul de ieșire &amp;quot;secventapara.out&amp;quot;.&lt;/div&gt;</summary>
		<author><name>Sovago Rares-Andrei</name></author>
	</entry>
	<entry>
		<id>https://wiki.universitas.ro/index.php?title=2818_-_Inserare_2&amp;diff=5516</id>
		<title>2818 - Inserare 2</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=2818_-_Inserare_2&amp;diff=5516"/>
		<updated>2023-04-29T16:41:54Z</updated>

		<summary type="html">&lt;p&gt;Sovago Rares-Andrei: /* Date de ieșire */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Cerinţa ==&lt;br /&gt;
Numim &#039;&#039;&#039;inserare&#039;&#039;&#039; a unui șir &#039;&#039;A&#039;&#039; într-un șir &#039;&#039;B&#039;&#039; introducerea, între două elemente ale șirului &#039;&#039;B&#039;&#039;, a tuturor elementelor lui &#039;&#039;A&#039;&#039;, pe poziții consecutive, în ordinea în care apar în &#039;&#039;A&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Se dau două șiruri cu &#039;&#039;&#039;n&#039;&#039;&#039;, respectiv &#039;&#039;&#039;m&#039;&#039;&#039; elemente numere întregi ordonate strict crescător, în care numerotarea elementelor începe de la &#039;&#039;&#039;1&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Se cere să se afișeze poziția din al doilea șir începând de la care poate fi inserat primul șir, astfel încât șirul obținut să fie strict crescător. Dacă nu există o astfel de poziție, se afișează mesajul &#039;&#039;&#039;imposibil&#039;&#039;&#039;.&lt;br /&gt;
== Date de intrare ==&lt;br /&gt;
Fișierul de intrare &#039;&#039;&#039;inserare2.in&#039;&#039;&#039; conține numere naturale din intervalul &#039;&#039;&#039;[1,10^6]&#039;&#039;&#039;: pe prima linie numerele &#039;&#039;&#039;m&#039;&#039;&#039; și &#039;&#039;&#039;n&#039;&#039;&#039;, iar pe fiecare dintre următoarele două linii câte un șir de &#039;&#039;&#039;m&#039;&#039;&#039;, respectiv de &#039;&#039;&#039;n&#039;&#039;&#039; numere întregi ordonate strict crescător. Numerele aflate pe aceeași linie a fișierului sunt separate prin câte un spațiu.&lt;br /&gt;
== Date de ieșire == &lt;br /&gt;
Dacă datele sunt introduse corect, pe ecran: &lt;br /&gt;
&amp;quot;Datele sunt introduse corect.&amp;quot;,fișierul de ieșire &#039;&#039;&#039;inserare2.out&#039;&#039;&#039; va conține poziția din al doilea șir începând de la care poate fi inserat primul șir, astfel încât șirul obținut să fie strict crescător. Dacă nu există o astfel de poziție, se afișează mesajul imposibil.. În cazul în care datele nu respectă restricțiile, se va afișa: &amp;quot;Datele nu corespund restricțiilor impuse.&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
== Restricţii şi precizări ==&lt;br /&gt;
*Pentru determinarea numerelor cerute se utilizează un algoritm eficient din punctul de vedere al memoriei necesare și al timpului de executare.&lt;br /&gt;
*Se recomandă evitarea memorării elementelor șirului într-un tablou sau în altă structură de date similară.&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
== Exemple ==&lt;br /&gt;
===Exemplul 1===&lt;br /&gt;
; &#039;&#039;inserare2.in&#039;&#039;&lt;br /&gt;
: 4 6&lt;br /&gt;
:15 16 17 19&lt;br /&gt;
:7 10 12 20 30 40&lt;br /&gt;
; &#039;&#039;Ecran&#039;&#039;&lt;br /&gt;
:Datele sunt introduse corect.&lt;br /&gt;
; &#039;&#039;inserare2.out&#039;&#039;&lt;br /&gt;
:imposibil&lt;br /&gt;
===Exemplul 2===&lt;br /&gt;
; &#039;&#039;inserare2.in&#039;&#039;&lt;br /&gt;
:3 4&lt;br /&gt;
:10 20 30&lt;br /&gt;
:5 15 25 35&lt;br /&gt;
; &#039;&#039;Ecra&#039;&#039;&lt;br /&gt;
:Datele sunt introduse corect.&lt;br /&gt;
; &#039;&#039;inserare2.out&#039;&#039;&lt;br /&gt;
:imposibil&lt;br /&gt;
===Exemplul 3===&lt;br /&gt;
; &#039;&#039;inserare2.in&#039;&#039;&lt;br /&gt;
:5 6&lt;br /&gt;
:2 4 6 8 10&lt;br /&gt;
:1 3 5 7 9 11&lt;br /&gt;
; &#039;&#039;Ecran&#039;&#039;&lt;br /&gt;
:Datele nu corespund restricțiilor impuse&lt;br /&gt;
; &#039;&#039;inserare2.out&#039;&#039;&lt;br /&gt;
:imposibil&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Rezolvare == &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
# 2818 - Inserare 2&lt;br /&gt;
def validate_input(n, m, A, B):&lt;br /&gt;
    # Verifică dacă datele de intrare corespund restricțiilor impuse&lt;br /&gt;
    if not (1 &amp;lt;= n &amp;lt;= 10 ** 6 and 1 &amp;lt;= m &amp;lt;= 10 ** 6):&lt;br /&gt;
        return False&lt;br /&gt;
    if len(A) != n or len(B) != m:&lt;br /&gt;
        return False&lt;br /&gt;
    if any(A[i] &amp;gt;= A[i + 1] for i in range(n - 1)) or any(B[i] &amp;gt;= B[i + 1] for i in range(m - 1)):&lt;br /&gt;
        return False&lt;br /&gt;
    return True&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def find_insertion_position(n, m, A, B):&lt;br /&gt;
    # Găsește poziția din al doilea șir începând de la care poate fi inserat primul șir,&lt;br /&gt;
    # astfel încât șirul obținut să fie strict crescător&lt;br /&gt;
    pozitie = 1&lt;br /&gt;
    for i in range(m):&lt;br /&gt;
        if B[i] &amp;gt;= A[0]:&lt;br /&gt;
            while pozitie &amp;lt; n and A[pozitie] &amp;lt;= B[i]:&lt;br /&gt;
                pozitie += 1&lt;br /&gt;
            if pozitie == n:&lt;br /&gt;
                return i + 1&lt;br /&gt;
    return &amp;quot;imposibil&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
if __name__ == &#039;__main__&#039;:&lt;br /&gt;
    # Citire date de intrare&lt;br /&gt;
    try:&lt;br /&gt;
        with open(&amp;quot;inserare2.in&amp;quot;, &amp;quot;r&amp;quot;) as fin:&lt;br /&gt;
            m, n = map(int, fin.readline().split())&lt;br /&gt;
            B = list(map(int, fin.readline().split()))&lt;br /&gt;
            A = list(map(int, fin.readline().split()))&lt;br /&gt;
    except ValueError:&lt;br /&gt;
        print(&amp;quot;Datele nu corespund restricțiilor impuse.&amp;quot;)&lt;br /&gt;
        exit()&lt;br /&gt;
&lt;br /&gt;
    # Validare date de intrare&lt;br /&gt;
    if not validate_input(n, m, A, B):&lt;br /&gt;
        print(&amp;quot;Datele nu corespund restricțiilor impuse.&amp;quot;)&lt;br /&gt;
        exit()&lt;br /&gt;
&lt;br /&gt;
    # Găsire poziție de inserare și afișare rezultat&lt;br /&gt;
    result = find_insertion_position(n, m, A, B)&lt;br /&gt;
    print(&amp;quot;Datele sunt introduse corect.&amp;quot;)&lt;br /&gt;
    with open(&amp;quot;inserare2.out&amp;quot;, &amp;quot;w&amp;quot;) as fout:&lt;br /&gt;
        fout.write(str(result) + &amp;quot;\n&amp;quot; if result != &amp;quot;imposibil&amp;quot; else &amp;quot;imposibil\n&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Explicatie==&lt;br /&gt;
Funcția validate_input(n, m, A, B) verifică dacă datele de intrare sunt valide, adică:&lt;br /&gt;
&lt;br /&gt;
n și m sunt numere întregi între 1 și 10^6;&lt;br /&gt;
lungimea listelor A și B este respectiv n și m;&lt;br /&gt;
listele A și B sunt strict crescătoare, adică fiecare element este mai mic decât elementul următor.&lt;br /&gt;
Funcția returnează True dacă datele sunt valide și False în caz contrar.&lt;br /&gt;
&lt;br /&gt;
Funcția find_insertion_position(n, m, A, B) primește două liste de numere (A și B) și încearcă să găsească poziția din lista B începând de la care se poate insera lista A astfel încât lista rezultată să fie strict crescătoare.&lt;br /&gt;
&lt;br /&gt;
Pentru a face acest lucru, funcția parcurge lista B și caută primul element care este mai mare sau egal cu primul element din lista A. Apoi, parcurge lista A și caută primul element care este mai mare decât ultimul element din secțiunea anterioară din lista A care a fost deja inserată în lista B. Dacă nu există un astfel de element, atunci inserarea este imposibilă.&lt;br /&gt;
&lt;br /&gt;
Funcția returnează poziția de inserare (în formatul specificat în enunțul problemei) sau stringul &amp;quot;imposibil&amp;quot; dacă inserarea este imposibilă.&lt;br /&gt;
&lt;br /&gt;
În blocul if __name__ == &#039;__main__&#039;: citim datele de intrare din fișierul &amp;quot;inserare2.in&amp;quot; și apoi verificăm dacă datele sunt valide folosind funcția validate_input(n, m, A, B). Dacă datele nu sunt valide, se afișează un mesaj corespunzător și se oprește execuția programului.&lt;br /&gt;
&lt;br /&gt;
Dacă datele sunt valide, se apelează funcția find_insertion_position(n, m, A, B) pentru a găsi poziția de inserare și se afișează un mesaj de confirmare a validității datelor. Apoi, rezultatul este afișat în fișierul de ieșire &amp;quot;inserare2.out&amp;quot;. Observați că, în cazul în care inserarea este imposibilă, se afișează stringul &amp;quot;imposibil&amp;quot; în locul poziției de inserare.&lt;/div&gt;</summary>
		<author><name>Sovago Rares-Andrei</name></author>
	</entry>
	<entry>
		<id>https://wiki.universitas.ro/index.php?title=2840_-_Secventa_Uniforma&amp;diff=5515</id>
		<title>2840 - Secventa Uniforma</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=2840_-_Secventa_Uniforma&amp;diff=5515"/>
		<updated>2023-04-29T16:41:25Z</updated>

		<summary type="html">&lt;p&gt;Sovago Rares-Andrei: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Cerinţa ==&lt;br /&gt;
Numim &#039;&#039;&#039;secvență uniformă&#039;&#039;&#039; a unui șir de numere naturale un subșir al acestuia, format din termeni cu aceeași valoare, aflați pe poziții consecutive în șirul dat. Lungimea secvenței este egală cu numărul de termeni ai acesteia.&lt;br /&gt;
&lt;br /&gt;
Se dă un șir de cel puțin două și cel mult &#039;&#039;&#039;1000000&#039;&#039;&#039; de numere naturale din intervalul &#039;&#039;&#039;[0,10^9]&#039;&#039;&#039;. În șir există cel puțin doi termeni egali pe poziții consecutive. Se cere să se determine o secvență uniformă de lungime maximă în șirul dat și să se afișeze pe lungimea acestei secvențe și termenii acesteia. Dacă sunt mai multe astfel de secvențe, se afișează doar termenii ultimei dintre acestea.&lt;br /&gt;
== Date de intrare ==&lt;br /&gt;
Fișierul de intrare &#039;&#039;&#039;secventauniforma.in&#039;&#039;&#039; conține pe prima linie un șir de cel puțin două și cel mult &#039;&#039;&#039;1000000&#039;&#039;&#039; de numere naturale din intervalul &#039;&#039;&#039;[0,10^9]&#039;&#039;&#039;, separate prin spații.&lt;br /&gt;
== Date de ieșire == &lt;br /&gt;
Dacă datele sunt introduse corect, pe ecran: &lt;br /&gt;
&amp;quot;Datele sunt introduse corect.&amp;quot;,fișierul de ieșire &#039;&#039;&#039;secventauniforma.out&#039;&#039;&#039; va conține pe prima linie lungimea acestei secvențe și, pe o linie nouă, separați prin câte un spațiu, termenii acesteia.. În cazul în care datele nu respectă restricțiile, se va afișa: &amp;quot;Datele nu corespund restricțiilor impuse.&amp;quot;.&lt;br /&gt;
== Restricţii şi precizări ==&lt;br /&gt;
*Pentru determinarea numerelor cerute se utilizează un algoritm eficient din punctul de vedere al memoriei necesare și al timpului de executare.&lt;br /&gt;
*Se recomandă evitarea memorării elementelor șirului într-un tablou sau în altă structură de date similară.&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
== Exemple ==&lt;br /&gt;
===Exemplul 1===&lt;br /&gt;
; &#039;&#039;secventauniforma.in&#039;&#039;&lt;br /&gt;
:1 1 1 1 1 1 1 1 1 1&lt;br /&gt;
; &#039;&#039;secventauniforma.out&#039;&#039;&lt;br /&gt;
:Datele sunt introduse corect.&lt;br /&gt;
:10&lt;br /&gt;
:1 1 1 1 1 1 1 1 1 1&lt;br /&gt;
&lt;br /&gt;
=== Exemplul 2 ===&lt;br /&gt;
; &#039;&#039;secventauniforma.in&#039;&#039;&lt;br /&gt;
: 5 5 5 5 5 5 5 5&lt;br /&gt;
; &#039;&#039;secventauniforma.out&#039;&#039;&lt;br /&gt;
:Datele sunt introduse corect.&lt;br /&gt;
:8&lt;br /&gt;
:5 5 5 5 5 5 5 5&lt;br /&gt;
===Exemplul 3===&lt;br /&gt;
; &#039;&#039;secventauniforma.in&#039;&#039;&lt;br /&gt;
: 2 3 1000000001&lt;br /&gt;
; &#039;&#039;iesire&#039;&#039;&lt;br /&gt;
:Datele nu corespund restricțiilor impuse.&lt;br /&gt;
; &#039;&#039;secventauniforma.out&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Rezolvare == &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
# 2840 - Secventa Uniforma&lt;br /&gt;
def valideaza_intrare(lst: list[int]) -&amp;gt; bool:&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    Verifică dacă datele de intrare sunt valide conform cerințelor.&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    if not (2 &amp;lt;= len(lst) &amp;lt;= 10 ** 6):&lt;br /&gt;
        return False&lt;br /&gt;
    for i in range(1, len(lst)):&lt;br /&gt;
        if lst[i] &amp;lt; 0 or lst[i] &amp;gt; 10 ** 9 or lst[i] != lst[i - 1]:&lt;br /&gt;
            return False&lt;br /&gt;
    return True&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def gaseste_secventa_uniforma(lst: list[int]) -&amp;gt; tuple[int, list[int]]:&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    Găsește cea mai lungă secvență uniformă în șirul dat.&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    if not valideaza_intrare(lst):&lt;br /&gt;
        return 0, []&lt;br /&gt;
    lungime_maxima = 1&lt;br /&gt;
    termeni_maximi = [lst[0]]&lt;br /&gt;
    lungime_curenta = 1&lt;br /&gt;
    termeni_curenti = [lst[0]]&lt;br /&gt;
    for i in range(1, len(lst)):&lt;br /&gt;
        if lst[i] == lst[i - 1]:&lt;br /&gt;
            lungime_curenta += 1&lt;br /&gt;
            termeni_curenti.append(lst[i])&lt;br /&gt;
        else:&lt;br /&gt;
            if lungime_curenta &amp;gt; lungime_maxima:&lt;br /&gt;
                lungime_maxima = lungime_curenta&lt;br /&gt;
                termeni_maximi = termeni_curenti&lt;br /&gt;
            lungime_curenta = 1&lt;br /&gt;
            termeni_curenti = [lst[i]]&lt;br /&gt;
    if lungime_curenta &amp;gt; lungime_maxima:&lt;br /&gt;
        lungime_maxima = lungime_curenta&lt;br /&gt;
        termeni_maximi = termeni_curenti&lt;br /&gt;
    return lungime_maxima, termeni_maximi&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def afiseaza_secventa_uniforma(lungime: int, termeni: list[int]) -&amp;gt; None:&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    Afișează secvența uniformă găsită în fișierul de ieșire.&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    with open(&amp;quot;secventauniforma.out&amp;quot;, &amp;quot;w&amp;quot;, encoding=&amp;quot;utf-8&amp;quot;) as f:&lt;br /&gt;
        if valideaza_intrare(lst):&lt;br /&gt;
            f.write(&amp;quot;Datele sunt introduse corect.\n&amp;quot;)&lt;br /&gt;
            f.write(str(lungime) + &amp;quot;\n&amp;quot;)&lt;br /&gt;
            f.write(&amp;quot; &amp;quot;.join(map(str, termeni)))&lt;br /&gt;
        else:&lt;br /&gt;
            f.write(&amp;quot;Datele nu corespund restricțiilor impuse.&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
if __name__ == &#039;__main__&#039;:&lt;br /&gt;
   # Citirea datelor de intrare din fișier&lt;br /&gt;
   with open(&amp;quot;secventauniforma.in&amp;quot;, &amp;quot;r&amp;quot;) as f:&lt;br /&gt;
       # Citim lista de numere din prima linie a fișierului și o convertim la listă de int&lt;br /&gt;
       lst = list(map(int, f.readline().split()))&lt;br /&gt;
&lt;br /&gt;
   # Găsirea secvenței uniforme și afișarea ei în fișierul de ieșire&lt;br /&gt;
   lungime, termeni = gaseste_secventa_uniforma(lst)&lt;br /&gt;
   afiseaza_secventa_uniforma(lungime, termeni)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Explicatie==&lt;br /&gt;
Funcția valideaza_intrare(lst: list[int]) -&amp;gt; bool verifică dacă datele de intrare sunt valide, adică:&lt;br /&gt;
&lt;br /&gt;
lista are o lungime între 2 și 10^6;&lt;br /&gt;
fiecare element al listei este un număr întreg între 0 și 10^9;&lt;br /&gt;
toți termenii din listă sunt egali.&lt;br /&gt;
Funcția returnează True dacă datele sunt valide și False în caz contrar.&lt;br /&gt;
&lt;br /&gt;
Funcția gaseste_secventa_uniforma(lst: list[int]) -&amp;gt; tuple[int, list[int]] primește o listă de numere și încearcă să găsească cea mai lungă secvență uniformă din acea listă. Dacă datele de intrare nu sunt valide (conform funcției valideaza_intrare), se va returna o secvență nulă, adică o secvență cu o lungime de 0 și o listă goală de termeni.&lt;br /&gt;
&lt;br /&gt;
Dacă datele de intrare sunt valide, funcția parcurge lista și verifică dacă fiecare element este egal cu elementul anterior. Dacă da, înseamnă că am găsit un termen nou în secvență uniformă curentă, iar lungimea acesteia crește cu 1 și adăugăm termenul la lista de termeni curenti. Dacă nu, înseamnă că am găsit o secvență uniformă mai mică decât cea curentă, deci verificăm dacă lungimea ei este mai mare decât lungimea maximă găsită până acum. Dacă da, actualizăm lungimea maximă și lista de termeni maximi.&lt;br /&gt;
&lt;br /&gt;
După ce am parcurs toată lista, returnăm lungimea maximă și lista de termeni maximi.&lt;br /&gt;
&lt;br /&gt;
Funcția afiseaza_secventa_uniforma(lungime: int, termeni: list[int]) -&amp;gt; None primește lungimea și lista de termeni a celei mai lungi secvențe uniforme găsite și le afișează într-un fișier de ieșire numit &amp;quot;secventauniforma.out&amp;quot;. Dacă datele de intrare nu sunt valide, afișează un mesaj corespunzător în locul secvenței uniforme.&lt;br /&gt;
&lt;br /&gt;
Observați că, în cadrul acestei funcții, se mai face încă o dată validarea datelor de intrare, folosind funcția valideaza_intrare(lst: list[int]) -&amp;gt; bool. Aceasta este o măsură de siguranță suplimentară, pentru a evita afișarea unei secvențe uniforme în cazul în care datele de intrare sunt invalide.&lt;br /&gt;
&lt;br /&gt;
În blocul if __name__ == &#039;__main__&#039;: citim datele de intrare din fișierul &amp;quot;secventauniform&lt;/div&gt;</summary>
		<author><name>Sovago Rares-Andrei</name></author>
	</entry>
	<entry>
		<id>https://wiki.universitas.ro/index.php?title=2834_-_Sir_13&amp;diff=5513</id>
		<title>2834 - Sir 13</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=2834_-_Sir_13&amp;diff=5513"/>
		<updated>2023-04-29T16:39:06Z</updated>

		<summary type="html">&lt;p&gt;Sovago Rares-Andrei: /* Date de ieșire */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Cerinţa ==&lt;br /&gt;
Se dă un șir de cel mult un milion de numere naturale din intervalul &#039;&#039;&#039;[0,10^9]&#039;&#039;&#039;, separate prin câte un spațiu. Șirul are cel puțin doi termeni pari și cel puțin doi termeni impari.&lt;br /&gt;
&lt;br /&gt;
Se cere să se afișeze mesajul &#039;&#039;&#039;DA&#039;&#039;&#039; dacă șirul aflat în fișier are un subșir ordonat crescător, format din toți termenii pari ai săi, și un subșir ordonat descrescător, format din toți termenii impari ai săi. Dacă nu există două astfel de subșiruri, programul afișează pe ecran mesajul &#039;&#039;&#039;NU&#039;&#039;&#039;.&lt;br /&gt;
== Date de intrare ==&lt;br /&gt;
Fișierul de intrare &#039;&#039;&#039;sir13.in&#039;&#039;&#039; conține elementele șirului, separate printr-un spațiu.&lt;br /&gt;
== Date de ieșire == &lt;br /&gt;
Dacă datele sunt introduse corect, in fisier se va afișa: &lt;br /&gt;
&amp;quot;Datele sunt introduse corect.&amp;quot;, fișierul de ieșire &#039;&#039;&#039;sir13.out&#039;&#039;&#039; va conține pe prima linie mesajul DA sau NU, corespunzător cerinței. În cazul în care datele nu respectă restricțiile, se va afișa in fisier: &amp;quot;Datele nu corespund restricțiilor impuse.&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
== Restricţii şi precizări ==&lt;br /&gt;
*Utilizați un algoritm eficient din punctul de vedere al timpului de executare și al memoriei necesare:&lt;br /&gt;
*se recomandă evitarea stocării elementelor șirului într-un tablou sau în altă structură de date similară;&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
== Exemple ==&lt;br /&gt;
===Exemplul 1===&lt;br /&gt;
; &#039;&#039;sir13.in&#039;&#039;&lt;br /&gt;
: 7 2 5 2 4 3 8&lt;br /&gt;
; &#039;&#039;Ecran&#039;&#039;&lt;br /&gt;
:Datele sunt introduse corect.&lt;br /&gt;
; &#039;&#039;sir13.out&#039;&#039;&lt;br /&gt;
:DA&lt;br /&gt;
=== Exemplul 2 ===&lt;br /&gt;
; sir13.in:&lt;br /&gt;
: 1 3 5 7 9 11 13 15 17&lt;br /&gt;
; &#039;&#039;Ecran&#039;&#039;&lt;br /&gt;
: Datele nu corespund restricțiilor impuse.&lt;br /&gt;
; sir13.OUT:&lt;br /&gt;
:NU&lt;br /&gt;
===Exemplul 3===&lt;br /&gt;
; &#039;&#039;sir13.in&#039;&#039;&lt;br /&gt;
: 3 2 1 4 6 5 8 7&lt;br /&gt;
; &#039;&#039;Ecran&#039;&#039;&lt;br /&gt;
: Datele nu corespund restricțiilor impuse.&lt;br /&gt;
; &#039;&#039;sir13.out&#039;&#039;&lt;br /&gt;
:DA&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Rezolvare == &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
# 2834 - Sir 13&lt;br /&gt;
def valideaza_intrarea(data):&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;Verifică dacă datele de intrare sunt valide.&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    nums = data.split()&lt;br /&gt;
    # Verificăm dacă lista de numere are lungimea minimă cerută&lt;br /&gt;
    if len(nums) &amp;lt; 4:&lt;br /&gt;
        return False&lt;br /&gt;
    # Verificăm dacă lista de numere conține cel puțin două numere pare și două numere impare&lt;br /&gt;
    numere_pare = 0&lt;br /&gt;
    numere_impare = 0&lt;br /&gt;
    for num in nums:&lt;br /&gt;
        if int(num) % 2 == 0:&lt;br /&gt;
            numere_pare += 1&lt;br /&gt;
        else:&lt;br /&gt;
            numere_impare += 1&lt;br /&gt;
    return numere_pare &amp;gt;= 2 and numere_impare &amp;gt;= 2&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def gaseste_subsecventa(nums, este_crescatoare):&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;Găsește o subsecvență ordonată crescător sau descrescător.&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    subsecventa = []&lt;br /&gt;
    ultimul_numar = None&lt;br /&gt;
    for num in nums:&lt;br /&gt;
        if ultimul_numar is None or (num &amp;gt; ultimul_numar) == este_crescatoare:&lt;br /&gt;
            subsecventa.append(num)&lt;br /&gt;
            ultimul_numar = num&lt;br /&gt;
    return subsecventa&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
if __name__ == &amp;quot;__main__&amp;quot;:&lt;br /&gt;
    # Citim datele de intrare din fișier&lt;br /&gt;
    with open(&amp;quot;sir13.in&amp;quot;) as f:&lt;br /&gt;
        data = f.read().strip()&lt;br /&gt;
    # Verificăm dacă datele de intrare sunt valide&lt;br /&gt;
    if not valideaza_intrarea(data):&lt;br /&gt;
        with open(&amp;quot;sir13.out&amp;quot;, &amp;quot;w&amp;quot;) as f:&lt;br /&gt;
            f.write(&amp;quot;NU&amp;quot;)&lt;br /&gt;
        print(&amp;quot;Datele nu corespund restricțiilor impuse.&amp;quot;)&lt;br /&gt;
    else:&lt;br /&gt;
        # Transformăm datele într-o listă de numere&lt;br /&gt;
        numere = list(map(int, data.split()))&lt;br /&gt;
        # Găsim o subsecvență ordonată crescător formată din numere pare și o subsecvență&lt;br /&gt;
        # ordonată descrescător formată din numere impare&lt;br /&gt;
        subsecventa_pare = gaseste_subsecventa(numere, True)&lt;br /&gt;
        subsecventa_impare = gaseste_subsecventa(numere, False)&lt;br /&gt;
        # Verificăm dacă am găsit cele două subsecvențe&lt;br /&gt;
        if len(subsecventa_pare) &amp;gt;= 2 and len(subsecventa_impare) &amp;gt;= 2:&lt;br /&gt;
            with open(&amp;quot;sir13.out&amp;quot;, &amp;quot;w&amp;quot;) as f:&lt;br /&gt;
                f.write(&amp;quot;DA&amp;quot;)&lt;br /&gt;
        else:&lt;br /&gt;
            with open(&amp;quot;sir13.out&amp;quot;, &amp;quot;w&amp;quot;) as f:&lt;br /&gt;
                f.write(&amp;quot;NU&amp;quot;)&lt;br /&gt;
        print(&amp;quot;Datele sunt introduse corect.&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Explicatie==&lt;br /&gt;
&lt;br /&gt;
Funcția valideaza_intrarea(data) verifică dacă datele de intrare sunt valide, adică lista de numere din string-ul data are cel puțin patru elemente, dintre care cel puțin două sunt pare și două sunt impare.&lt;br /&gt;
&lt;br /&gt;
Funcția gaseste_subsecventa(nums, este_crescatoare) primește o listă de numere și un boolean care indică dacă se dorește o subsecvență crescătoare sau descrescătoare. Funcția returnează o subsecvență ordonată crescător sau descrescător formată din elementele listei primite, în funcție de valoarea parametrului este_crescatoare.&lt;br /&gt;
&lt;br /&gt;
În blocul if __name__ == &amp;quot;__main__&amp;quot;:, se citesc datele de intrare din fișierul &amp;quot;sir13.in&amp;quot; și se verifică dacă acestea sunt valide folosind funcția valideaza_intrarea(data). Dacă datele sunt valide, se transformă string-ul data într-o listă de numere, se găsesc cele două subsecvențe (ordonată crescător formată din numere pare și ordonată descrescător formată din numere impare), și se verifică dacă am găsit cele două subsecvențe. Rezultatul este scris în fișierul &amp;quot;sir13.out&amp;quot;. Dacă datele de intrare nu sunt valide, se scrie &amp;quot;NU&amp;quot; în fișierul de ieșire și se afișează mesajul &amp;quot;Datele nu corespund restricțiilor impuse.&amp;quot;. În caz contrar, se scrie &amp;quot;DA&amp;quot; în fișierul de ieșire și se afișează mesajul &amp;quot;Datele sunt introduse corect.&amp;quot;.&lt;/div&gt;</summary>
		<author><name>Sovago Rares-Andrei</name></author>
	</entry>
	<entry>
		<id>https://wiki.universitas.ro/index.php?title=2845_-_Wildfire_1&amp;diff=5512</id>
		<title>2845 - Wildfire 1</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=2845_-_Wildfire_1&amp;diff=5512"/>
		<updated>2023-04-29T16:38:42Z</updated>

		<summary type="html">&lt;p&gt;Sovago Rares-Andrei: /* Rezolvare */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Cerinţa ==&lt;br /&gt;
Se consideră o pădure ce conține &#039;&#039;&#039;n•m&#039;&#039;&#039; copaci aranjați pe &#039;&#039;&#039;n&#039;&#039;&#039; linii și &#039;&#039;&#039;m&#039;&#039;&#039; coloane în care s-a produs un incendiu. Pădurarii cunosc coordonatele &#039;&#039;&#039;x&#039;&#039;&#039; și &#039;&#039;&#039;y&#039;&#039;&#039; ale copacului de la care a izbucnit focul și modalitatea prin care acesta se extinde. Astfel, dacă un copac se aprinde într-o anumită zi, în ziua următoare se vor aprind copacii vecini cu acesta pe linie sau coloană care nu sunt încă afectați de incendiu.&lt;br /&gt;
Știind &#039;&#039;&#039;x&#039;&#039;&#039; și &#039;&#039;&#039;y&#039;&#039;&#039;, coordonatele inițiale ale focului și &#039;&#039;&#039;n&#039;&#039;&#039; și &#039;&#039;&#039;m&#039;&#039;&#039;, dimensiunile pădurii, ajutați pădurarii să determine numărul de zile după care va fi afectat fiecare copac al pădurii.&lt;br /&gt;
== Date de intrare ==&lt;br /&gt;
Programul citește de la tastatură numerele &#039;&#039;&#039;x y n m&#039;&#039;&#039;, cu semnificația de mai sus.&lt;br /&gt;
== Date de ieșire == &lt;br /&gt;
Dacă datele sunt introduse corect, pe ecran se va afișa: &lt;br /&gt;
&amp;quot;Datele sunt introduse corect.&amp;quot;, Programul va afișa pe ecran &#039;&#039;&#039;n•m&#039;&#039;&#039; numere, reprezentând numărul de zile după care va fi afectat fiecare copac al pădurii. În cazul în care datele nu respectă restricțiile, se va afișa pe ecran: &amp;quot;Datele nu corespund restricțiilor impuse.&amp;quot;.&lt;br /&gt;
== Restricţii şi precizări ==&lt;br /&gt;
* 1 ≤ x ≤ n ≤ 1.000&lt;br /&gt;
*1 ≤ y ≤ m ≤ 1.000&lt;br /&gt;
&lt;br /&gt;
== Exemple ==&lt;br /&gt;
===Exemplul 1===&lt;br /&gt;
; &#039;&#039;Intrare&#039;&#039;&lt;br /&gt;
:2 2 4 5&lt;br /&gt;
; &#039;&#039;Ieșire&#039;&#039;&lt;br /&gt;
:Datele sunt introduse corect.&lt;br /&gt;
:4 3 2 3 4&lt;br /&gt;
:3 2 1 2 3&lt;br /&gt;
:2 1 0 1 2&lt;br /&gt;
:3 2 1 2 3&lt;br /&gt;
&lt;br /&gt;
=== Exemplul 2 ===&lt;br /&gt;
; &#039;&#039;Intrare&#039;&#039;&lt;br /&gt;
:3 3 9 9&lt;br /&gt;
; &#039;&#039;Ieșire&#039;&#039;&lt;br /&gt;
:Datele sunt introduse corect.&lt;br /&gt;
:6 5 4 3 4 5 6 7 8&lt;br /&gt;
:5 4 3 2 3 4 5 6 7&lt;br /&gt;
:4 3 2 1 2 3 4 5 6&lt;br /&gt;
:3 2 1 0 1 2 3 4 5&lt;br /&gt;
:4 3 2 1 2 3 4 5 6&lt;br /&gt;
:5 4 3 2 3 4 5 6 7&lt;br /&gt;
:6 5 4 3 4 5 6 7 8&lt;br /&gt;
:7 6 5 4 5 6 7 8 9&lt;br /&gt;
:8 7 6 5 6 7 8 9 10&lt;br /&gt;
&lt;br /&gt;
===Exemplul 3===&lt;br /&gt;
; &#039;&#039;Intrare&#039;&#039;&lt;br /&gt;
: 0 1 5 5&lt;br /&gt;
; &#039;&#039;Ieșire&#039;&#039;&lt;br /&gt;
:Datele nu corespund restricțiilor impuse..&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Rezolvare == &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
# 2845 - Wildfire 1&lt;br /&gt;
def validate_date_intrare(x: int, y: int, n: int, m: int) -&amp;gt; bool:&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    Verifică dacă datele de intrare sunt valide.&lt;br /&gt;
    :param x: coordonata x a copacului de la care a izbucnit focul&lt;br /&gt;
    :param y: coordonata y a copacului de la care a izbucnit focul&lt;br /&gt;
    :param n: numărul de linii ale pădurii&lt;br /&gt;
    :param m: numărul de coloane ale pădurii&lt;br /&gt;
    :return: True dacă datele sunt valide, False altfel&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    if not (1 &amp;lt;= x &amp;lt;= n &amp;lt;= 1000 and 1 &amp;lt;= y &amp;lt;= m &amp;lt;= 1000):&lt;br /&gt;
        return False&lt;br /&gt;
    return True&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def rezolva_problema(x: int, y: int, n: int, m: int) -&amp;gt; list:&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    Calculează numărul de zile după care va fi afectat fiecare copac al pădurii.&lt;br /&gt;
    :param x: coordonata x a copacului de la care a izbucnit focul&lt;br /&gt;
    :param y: coordonata y a copacului de la care a izbucnit focul&lt;br /&gt;
    :param n: numărul de linii ale pădurii&lt;br /&gt;
    :param m: numărul de coloane ale pădurii&lt;br /&gt;
    :return: lista cu numărul de zile pentru fiecare copac al pădurii&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    matrice = [[0] * m for _ in range(n)]&lt;br /&gt;
    matrice[x][y] = 1&lt;br /&gt;
    for val in range(2, n * m + 1):&lt;br /&gt;
        for i, linie in enumerate(matrice):&lt;br /&gt;
            for j, elem in enumerate(linie):&lt;br /&gt;
                if elem == val - 1:&lt;br /&gt;
                    for ii, jj in ((i + 1, j), (i - 1, j), (i, j + 1), (i, j - 1)):&lt;br /&gt;
                        if 0 &amp;lt;= ii &amp;lt; n and 0 &amp;lt;= jj &amp;lt; m and matrice[ii][jj] == 0:&lt;br /&gt;
                            matrice[ii][jj] = val&lt;br /&gt;
    return [elem - 1 for linie in matrice for elem in linie]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
if __name__ == &#039;__main__&#039;:&lt;br /&gt;
    try:&lt;br /&gt;
        x, y, n, m = map(int, input().strip().split())&lt;br /&gt;
        if not validate_date_intrare(x, y, n, m):&lt;br /&gt;
            print(&amp;quot;Datele nu corespund restricțiilor impuse.&amp;quot;)&lt;br /&gt;
        else:&lt;br /&gt;
            rezultat = rezolva_problema(x, y, n, m)&lt;br /&gt;
            print(&amp;quot;Datele sunt introduse corect.&amp;quot;)&lt;br /&gt;
            for i in range(n):&lt;br /&gt;
                print(*rezultat[i * m: (i + 1) * m])&lt;br /&gt;
    except ValueError:&lt;br /&gt;
        print(&amp;quot;Datele introduse sunt invalide.&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Explicatie==&lt;br /&gt;
Funcția validate_date_intrare primește patru parametri: x, y, n și m. Acești parametri reprezintă coordonatele copacului de la care a izbucnit focul și dimensiunile pădurii. Funcția verifică dacă valorile acestor parametri sunt valide, adică x, y, n și m trebuie să fie întregi pozitivi și mai mici sau egali cu 1000.&lt;br /&gt;
&lt;br /&gt;
Funcția rezolva_problema primește aceiași patru parametri și calculează numărul de zile după care va fi afectat fiecare copac al pădurii, pornind de la copacul de la care a izbucnit focul. Se creează o matrice de dimensiunea nxm și se inițializează elementul de la coordonatele (x, y) cu 1. Apoi, se parcurge matricea și se calculează numărul de zile pentru fiecare copac în parte, folosind algoritmul dat în cerință.&lt;br /&gt;
&lt;br /&gt;
În main, se citesc de la tastatură valorile parametrilor x, y, n și m, se validează datele de intrare folosind funcția validate_date_intrare și se calculează și afișează rezultatul folosind funcția rezolva_problema.&lt;/div&gt;</summary>
		<author><name>Sovago Rares-Andrei</name></author>
	</entry>
	<entry>
		<id>https://wiki.universitas.ro/index.php?title=3512_-_Factorial_Query&amp;diff=5511</id>
		<title>3512 - Factorial Query</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=3512_-_Factorial_Query&amp;diff=5511"/>
		<updated>2023-04-29T16:37:14Z</updated>

		<summary type="html">&lt;p&gt;Sovago Rares-Andrei: /* Date de ieșire */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Cerinţa ==&lt;br /&gt;
Se dau &#039;&#039;&#039;n&#039;&#039;&#039; numere naturale. Să se calculeze produsul factorialelor acestora, modulo &#039;&#039;&#039;1.000.000.007&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
== Date de intrare ==&lt;br /&gt;
Programul citește de la tastatură numărul &#039;&#039;&#039;n&#039;&#039;&#039;, iar apoi &#039;&#039;&#039;n&#039;&#039;&#039; numere naturale, separate prin spații.&lt;br /&gt;
== Date de ieșire == &lt;br /&gt;
Dacă datele sunt introduse corect, pe ecran se va afișa: &lt;br /&gt;
&amp;quot;Datele sunt introduse corect.&amp;quot;, programul va afișa pe ecran produsul factorialelor celor &#039;&#039;&#039;n&#039;&#039;&#039; numere citite. În cazul în care datele nu respectă restricțiile, se va afișa pe ecran: &amp;quot;Datele nu corespund restricțiilor impuse.&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
== Restricţii şi precizări ==&lt;br /&gt;
* 1 ≤ n ≤ 1.000.000&lt;br /&gt;
*cele &#039;&#039;&#039;n&#039;&#039;&#039; numere sunt mai mici sau egale cu &#039;&#039;&#039;10.000.000&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
== Exemple ==&lt;br /&gt;
===Exemplul 1===&lt;br /&gt;
; &#039;&#039;Intrare&#039;&#039;&lt;br /&gt;
: 4&lt;br /&gt;
:4 2 1 3&lt;br /&gt;
; &#039;&#039;Ieșire&#039;&#039;&lt;br /&gt;
:Datele sunt introduse corect.&lt;br /&gt;
:288&lt;br /&gt;
=== Exemplul 2 ===&lt;br /&gt;
; &#039;&#039;Intrare&#039;&#039;&lt;br /&gt;
: -5&lt;br /&gt;
:1 2 3&lt;br /&gt;
; &#039;&#039;Ieșire&#039;&#039;&lt;br /&gt;
:Datele nu corespund restricțiilor impuse.&lt;br /&gt;
===Exemplul 3===&lt;br /&gt;
; &#039;&#039;Intrare&#039;&#039;&lt;br /&gt;
: 6&lt;br /&gt;
:1 1 1 1 1 1&lt;br /&gt;
; &#039;&#039;Ieșire&#039;&#039;&lt;br /&gt;
:Datele sunt introduse corect.&lt;br /&gt;
:1&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Rezolvare == &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
# 3512 - Factorial Query&lt;br /&gt;
def validare_date(n, numere):&lt;br /&gt;
    # Verificăm dacă n se află între 1 și 1.000.000&lt;br /&gt;
    if n &amp;lt; 1 or n &amp;gt; 1000000:&lt;br /&gt;
        return False&lt;br /&gt;
&lt;br /&gt;
    # Verificăm dacă fiecare număr din listă este mai mic sau egal cu 10.000.000&lt;br /&gt;
    for numar in numere:&lt;br /&gt;
        if numar &amp;gt; 10000000:&lt;br /&gt;
            return False&lt;br /&gt;
&lt;br /&gt;
    # Datele sunt corecte&lt;br /&gt;
    return True&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def factorial(n):&lt;br /&gt;
    # Returnează factorialul lui n, redus modular la 1.000.000.007&lt;br /&gt;
    produs = 1&lt;br /&gt;
    for i in range(1, n + 1):&lt;br /&gt;
        produs = (produs * i) % 1000000007&lt;br /&gt;
    return produs&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def main():&lt;br /&gt;
    # Citim numărul n de la tastatură&lt;br /&gt;
    n_input = input(&amp;quot;Introduceti numarul n: &amp;quot;)&lt;br /&gt;
    if not n_input:&lt;br /&gt;
        print(&amp;quot;Introduceti un numar n mai mare decat 0.&amp;quot;)&lt;br /&gt;
        return&lt;br /&gt;
    n = int(n_input)&lt;br /&gt;
&lt;br /&gt;
    # Citim cele n numere de la tastatură&lt;br /&gt;
    numere_input = input(&amp;quot;Introduceti cele n numere, separate prin spatiu: &amp;quot;)&lt;br /&gt;
    if not numere_input:&lt;br /&gt;
        print(&amp;quot;Introduceti cel putin un numar.&amp;quot;)&lt;br /&gt;
        return&lt;br /&gt;
    numere = list(map(int, numere_input.split()))&lt;br /&gt;
&lt;br /&gt;
    # Validăm datele de intrare&lt;br /&gt;
    if not validare_date(n, numere):&lt;br /&gt;
        print(&amp;quot;Datele nu corespund restricțiilor impuse.&amp;quot;)&lt;br /&gt;
        return&lt;br /&gt;
&lt;br /&gt;
    # Calculăm produsul factorialelor și îl reducem modular la 1.000.000.007&lt;br /&gt;
    produs = 1&lt;br /&gt;
    for numar in numere:&lt;br /&gt;
        produs = (produs * factorial(numar)) % 1000000007&lt;br /&gt;
&lt;br /&gt;
    # Afișăm rezultatul&lt;br /&gt;
    print(&amp;quot;Datele sunt introduse corect.&amp;quot;)&lt;br /&gt;
    print(f&amp;quot;Produsul factorialelor este: {produs}&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
if __name__ == &amp;quot;__main__&amp;quot;:&lt;br /&gt;
    main()&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Explicatie==&lt;br /&gt;
&lt;br /&gt;
Funcția validare_date(n, numere)&lt;br /&gt;
&lt;br /&gt;
Această funcție primește un număr n și o listă de n numere și verifică dacă acestea corespund restricțiilor impuse. Are următorii parametri:&lt;br /&gt;
&lt;br /&gt;
n - numărul de elemente din listă&lt;br /&gt;
numere - lista de n numere de verificat&lt;br /&gt;
Funcția returnează True dacă datele sunt valide și False în caz contrar.&lt;br /&gt;
&lt;br /&gt;
Funcția factorial(n)&lt;br /&gt;
&lt;br /&gt;
Această funcție calculează factorialul unui număr n și returnează valoarea acestuia, redus modular la 1.000.000.007. Are un singur parametru:&lt;br /&gt;
&lt;br /&gt;
n - numărul al cărui factorial trebuie calculat&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Funcția main()&lt;br /&gt;
&lt;br /&gt;
Această funcție este funcția principală a programului și este rulată atunci când scriptul Python este executat. Funcția citește de la tastatură un număr n și o listă de n numere, verifică dacă datele sunt valide cu ajutorul funcției validare_date(n, numere), calculează produsul factorialelor cu ajutorul funcției factorial(n) și afișează rezultatul la consolă. Dacă datele introduse nu corespund restricțiilor impuse, se afișează un mesaj de eroare.&lt;/div&gt;</summary>
		<author><name>Sovago Rares-Andrei</name></author>
	</entry>
	<entry>
		<id>https://wiki.universitas.ro/index.php?title=3512_-_Factorial_Query&amp;diff=5510</id>
		<title>3512 - Factorial Query</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=3512_-_Factorial_Query&amp;diff=5510"/>
		<updated>2023-04-29T16:36:56Z</updated>

		<summary type="html">&lt;p&gt;Sovago Rares-Andrei: /* Restricţii şi precizări */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Cerinţa ==&lt;br /&gt;
Se dau &#039;&#039;&#039;n&#039;&#039;&#039; numere naturale. Să se calculeze produsul factorialelor acestora, modulo &#039;&#039;&#039;1.000.000.007&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
== Date de intrare ==&lt;br /&gt;
Programul citește de la tastatură numărul &#039;&#039;&#039;n&#039;&#039;&#039;, iar apoi &#039;&#039;&#039;n&#039;&#039;&#039; numere naturale, separate prin spații.&lt;br /&gt;
== Date de ieșire == &lt;br /&gt;
Dacă datele sunt introduse corect, pe ecran se va afișa: &lt;br /&gt;
&amp;quot;Datele sunt introduse corect.&amp;quot;, programul va afișa pe ecran produsul factorialelor celor n numere citite. În cazul în care datele nu respectă restricțiile, se va afișa pe ecran: &amp;quot;Datele nu corespund restricțiilor impuse.&amp;quot;.&lt;br /&gt;
== Restricţii şi precizări ==&lt;br /&gt;
* 1 ≤ n ≤ 1.000.000&lt;br /&gt;
*cele &#039;&#039;&#039;n&#039;&#039;&#039; numere sunt mai mici sau egale cu &#039;&#039;&#039;10.000.000&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
== Exemple ==&lt;br /&gt;
===Exemplul 1===&lt;br /&gt;
; &#039;&#039;Intrare&#039;&#039;&lt;br /&gt;
: 4&lt;br /&gt;
:4 2 1 3&lt;br /&gt;
; &#039;&#039;Ieșire&#039;&#039;&lt;br /&gt;
:Datele sunt introduse corect.&lt;br /&gt;
:288&lt;br /&gt;
=== Exemplul 2 ===&lt;br /&gt;
; &#039;&#039;Intrare&#039;&#039;&lt;br /&gt;
: -5&lt;br /&gt;
:1 2 3&lt;br /&gt;
; &#039;&#039;Ieșire&#039;&#039;&lt;br /&gt;
:Datele nu corespund restricțiilor impuse.&lt;br /&gt;
===Exemplul 3===&lt;br /&gt;
; &#039;&#039;Intrare&#039;&#039;&lt;br /&gt;
: 6&lt;br /&gt;
:1 1 1 1 1 1&lt;br /&gt;
; &#039;&#039;Ieșire&#039;&#039;&lt;br /&gt;
:Datele sunt introduse corect.&lt;br /&gt;
:1&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Rezolvare == &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
# 3512 - Factorial Query&lt;br /&gt;
def validare_date(n, numere):&lt;br /&gt;
    # Verificăm dacă n se află între 1 și 1.000.000&lt;br /&gt;
    if n &amp;lt; 1 or n &amp;gt; 1000000:&lt;br /&gt;
        return False&lt;br /&gt;
&lt;br /&gt;
    # Verificăm dacă fiecare număr din listă este mai mic sau egal cu 10.000.000&lt;br /&gt;
    for numar in numere:&lt;br /&gt;
        if numar &amp;gt; 10000000:&lt;br /&gt;
            return False&lt;br /&gt;
&lt;br /&gt;
    # Datele sunt corecte&lt;br /&gt;
    return True&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def factorial(n):&lt;br /&gt;
    # Returnează factorialul lui n, redus modular la 1.000.000.007&lt;br /&gt;
    produs = 1&lt;br /&gt;
    for i in range(1, n + 1):&lt;br /&gt;
        produs = (produs * i) % 1000000007&lt;br /&gt;
    return produs&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def main():&lt;br /&gt;
    # Citim numărul n de la tastatură&lt;br /&gt;
    n_input = input(&amp;quot;Introduceti numarul n: &amp;quot;)&lt;br /&gt;
    if not n_input:&lt;br /&gt;
        print(&amp;quot;Introduceti un numar n mai mare decat 0.&amp;quot;)&lt;br /&gt;
        return&lt;br /&gt;
    n = int(n_input)&lt;br /&gt;
&lt;br /&gt;
    # Citim cele n numere de la tastatură&lt;br /&gt;
    numere_input = input(&amp;quot;Introduceti cele n numere, separate prin spatiu: &amp;quot;)&lt;br /&gt;
    if not numere_input:&lt;br /&gt;
        print(&amp;quot;Introduceti cel putin un numar.&amp;quot;)&lt;br /&gt;
        return&lt;br /&gt;
    numere = list(map(int, numere_input.split()))&lt;br /&gt;
&lt;br /&gt;
    # Validăm datele de intrare&lt;br /&gt;
    if not validare_date(n, numere):&lt;br /&gt;
        print(&amp;quot;Datele nu corespund restricțiilor impuse.&amp;quot;)&lt;br /&gt;
        return&lt;br /&gt;
&lt;br /&gt;
    # Calculăm produsul factorialelor și îl reducem modular la 1.000.000.007&lt;br /&gt;
    produs = 1&lt;br /&gt;
    for numar in numere:&lt;br /&gt;
        produs = (produs * factorial(numar)) % 1000000007&lt;br /&gt;
&lt;br /&gt;
    # Afișăm rezultatul&lt;br /&gt;
    print(&amp;quot;Datele sunt introduse corect.&amp;quot;)&lt;br /&gt;
    print(f&amp;quot;Produsul factorialelor este: {produs}&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
if __name__ == &amp;quot;__main__&amp;quot;:&lt;br /&gt;
    main()&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Explicatie==&lt;br /&gt;
&lt;br /&gt;
Funcția validare_date(n, numere)&lt;br /&gt;
&lt;br /&gt;
Această funcție primește un număr n și o listă de n numere și verifică dacă acestea corespund restricțiilor impuse. Are următorii parametri:&lt;br /&gt;
&lt;br /&gt;
n - numărul de elemente din listă&lt;br /&gt;
numere - lista de n numere de verificat&lt;br /&gt;
Funcția returnează True dacă datele sunt valide și False în caz contrar.&lt;br /&gt;
&lt;br /&gt;
Funcția factorial(n)&lt;br /&gt;
&lt;br /&gt;
Această funcție calculează factorialul unui număr n și returnează valoarea acestuia, redus modular la 1.000.000.007. Are un singur parametru:&lt;br /&gt;
&lt;br /&gt;
n - numărul al cărui factorial trebuie calculat&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Funcția main()&lt;br /&gt;
&lt;br /&gt;
Această funcție este funcția principală a programului și este rulată atunci când scriptul Python este executat. Funcția citește de la tastatură un număr n și o listă de n numere, verifică dacă datele sunt valide cu ajutorul funcției validare_date(n, numere), calculează produsul factorialelor cu ajutorul funcției factorial(n) și afișează rezultatul la consolă. Dacă datele introduse nu corespund restricțiilor impuse, se afișează un mesaj de eroare.&lt;/div&gt;</summary>
		<author><name>Sovago Rares-Andrei</name></author>
	</entry>
	<entry>
		<id>https://wiki.universitas.ro/index.php?title=3144_-_Cifre_Romane&amp;diff=5509</id>
		<title>3144 - Cifre Romane</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=3144_-_Cifre_Romane&amp;diff=5509"/>
		<updated>2023-04-29T16:35:21Z</updated>

		<summary type="html">&lt;p&gt;Sovago Rares-Andrei: /* Exemplul 3 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Cerinţa ==&lt;br /&gt;
Alexandru a învățat azi despre numerele romane și cum se scriu acestea. Fiind distras de ce spuneau colegii a ajuns acasă și a realizat că nu știe cum să transforme un număr din cifre arabe în cifre romane. Deoarece a doua zi are un test numai din acest capitol, vă roagă să îl ajutați la transformarea unui număr &#039;&#039;&#039;N&#039;&#039;&#039; dat, scris cu cifre arabe în cifre romane.&lt;br /&gt;
== Date de intrare ==&lt;br /&gt;
Fișierul &#039;&#039;&#039;&#039;&#039;cifre_romane.in&#039;&#039;&#039;&#039;&#039; conține un număr natural &#039;&#039;&#039;N&#039;&#039;&#039; scris cu cifre arabe.&lt;br /&gt;
&lt;br /&gt;
== Date de ieșire == &lt;br /&gt;
Dacă datele sunt introduse corect, pe ecran se va afișa: &lt;br /&gt;
&amp;quot;Datele sunt introduse corect.&amp;quot;, programul va afișa in fișierul &#039;&#039;&#039;&#039;&#039;cifre_romane.out&#039;&#039;&#039;&#039;&#039; va conține scrierea cu cifre romane a lui &#039;&#039;&#039;N&#039;&#039;&#039;. În cazul în care datele nu respectă restricțiile, se va afișa pe ecran: &amp;quot;Datele nu corespund restricțiilor impuse.&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
== Restricţii şi precizări ==&lt;br /&gt;
*1 ≤ &#039;&#039;&#039;n&#039;&#039;&#039; ≤ 3999&lt;br /&gt;
*cifrele romane sunt:&lt;br /&gt;
I=1&lt;br /&gt;
V=5&lt;br /&gt;
X=10&lt;br /&gt;
L=50&lt;br /&gt;
C=100&lt;br /&gt;
D=500&lt;br /&gt;
M=1000&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
== Exemple ==&lt;br /&gt;
===Exemplul 1===&lt;br /&gt;
; &#039;&#039;cifre_romane.in&#039;&#039;&lt;br /&gt;
:4&lt;br /&gt;
; &#039;&#039;Ecran&#039;&#039;&lt;br /&gt;
:Datele sunt introduse corect.&lt;br /&gt;
; &#039;&#039;cifre_romane.out&#039;&#039;&lt;br /&gt;
:IV&lt;br /&gt;
&lt;br /&gt;
=== Exemplul 2 ===&lt;br /&gt;
&lt;br /&gt;
; &#039;&#039;cifre_romane.in&#039;&#039;&lt;br /&gt;
:5&lt;br /&gt;
; &#039;&#039;Ecran&#039;&#039;&lt;br /&gt;
:Datele sunt introduse corect.&lt;br /&gt;
; &#039;&#039;cifre_romane.out&#039;&#039;&lt;br /&gt;
:V&lt;br /&gt;
&lt;br /&gt;
=== Exemplul 3 ===&lt;br /&gt;
; &#039;&#039;cifre_romane.in&#039;&#039;&lt;br /&gt;
:4000&lt;br /&gt;
; &#039;&#039;Ecran&#039;&#039;&lt;br /&gt;
:Datele nu corespund restricțiilor impuse&lt;br /&gt;
; &#039;&#039;cifre_romane.out&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
== Rezolvare == &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
# 3144 - Cifre Romane&lt;br /&gt;
def validare(n):&lt;br /&gt;
    if n &amp;lt; 1 or n &amp;gt; 3999:&lt;br /&gt;
        return False&lt;br /&gt;
    return True&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def transforma_in_romane(n):&lt;br /&gt;
    romane = [(1000, &#039;M&#039;), (900, &#039;CM&#039;), (500, &#039;D&#039;), (400, &#039;CD&#039;), (100, &#039;C&#039;),&lt;br /&gt;
              (90, &#039;XC&#039;), (50, &#039;L&#039;), (40, &#039;XL&#039;), (10, &#039;X&#039;), (9, &#039;IX&#039;),&lt;br /&gt;
              (5, &#039;V&#039;), (4, &#039;IV&#039;), (1, &#039;I&#039;)]&lt;br /&gt;
    rest = n&lt;br /&gt;
    rezultat = &#039;&#039;&lt;br /&gt;
    while rest &amp;gt; 0:&lt;br /&gt;
        for arab, roman in romane:&lt;br /&gt;
            while rest &amp;gt;= arab:&lt;br /&gt;
                rezultat += roman&lt;br /&gt;
                rest -= arab&lt;br /&gt;
    return rezultat&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def main():&lt;br /&gt;
    with open(&#039;cifre_romane.in&#039;, &#039;r&#039;) as f:&lt;br /&gt;
        n = int(f.readline().strip())&lt;br /&gt;
&lt;br /&gt;
    if not validare(n):&lt;br /&gt;
        print(&#039;Datele nu corespund restricțiilor impuse.&#039;)&lt;br /&gt;
    else:&lt;br /&gt;
        print(&#039;Datele sunt introduse corect.&#039;)&lt;br /&gt;
        rezultat = transforma_in_romane(n)&lt;br /&gt;
        with open(&#039;cifre_romane.out&#039;, &#039;w&#039;) as f:&lt;br /&gt;
            f.write(rezultat)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
if __name__ == &#039;__main__&#039;:&lt;br /&gt;
    main()&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Explicatie==&lt;br /&gt;
Funcția validare(n)&lt;br /&gt;
&lt;br /&gt;
Această funcție verifică dacă datele de intrare sunt valide. Are un singur parametru:&lt;br /&gt;
&lt;br /&gt;
n - numărul întreg care trebuie transformat în cifre romane&lt;br /&gt;
Funcția returnează True dacă datele sunt valide și False în caz contrar.&lt;br /&gt;
&lt;br /&gt;
Funcția transforma_in_romane(n)&lt;br /&gt;
&lt;br /&gt;
Această funcție primește un număr întreg n și returnează echivalentul în cifre romane ale acestuia. Funcția folosește o listă romane care conține tupluri cu perechile (arab, roman) pentru fiecare simbol din cifrele romane, în ordinea descrescătoare a valorii acestora. Apoi, se parcurge această listă de la început până la sfârșit și se adaugă în rezultat simbolul roman corespunzător valorii arabe până când se ajunge la finalul listei sau până când numărul întreg n devine 0.&lt;br /&gt;
&lt;br /&gt;
Funcția main()&lt;br /&gt;
&lt;br /&gt;
Această funcție este funcția principală a programului și este rulată atunci când scriptul Python este executat. Funcția deschide fișierul de intrare cifre_romane.in, citește numărul întreg care trebuie transformat în cifre romane, verifică dacă datele de intrare sunt valide cu ajutorul funcției validare(n), transformă numărul în cifre romane cu ajutorul funcției transforma_in_romane(n) și afișează rezultatul în fișierul de ieșire cifre_romane.out. Dacă datele de intrare nu corespund restricțiilor impuse, se afișează un mesaj de eroare.&lt;/div&gt;</summary>
		<author><name>Sovago Rares-Andrei</name></author>
	</entry>
	<entry>
		<id>https://wiki.universitas.ro/index.php?title=3144_-_Cifre_Romane&amp;diff=5508</id>
		<title>3144 - Cifre Romane</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=3144_-_Cifre_Romane&amp;diff=5508"/>
		<updated>2023-04-29T16:34:30Z</updated>

		<summary type="html">&lt;p&gt;Sovago Rares-Andrei: /* Exemplul 2 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Cerinţa ==&lt;br /&gt;
Alexandru a învățat azi despre numerele romane și cum se scriu acestea. Fiind distras de ce spuneau colegii a ajuns acasă și a realizat că nu știe cum să transforme un număr din cifre arabe în cifre romane. Deoarece a doua zi are un test numai din acest capitol, vă roagă să îl ajutați la transformarea unui număr &#039;&#039;&#039;N&#039;&#039;&#039; dat, scris cu cifre arabe în cifre romane.&lt;br /&gt;
== Date de intrare ==&lt;br /&gt;
Fișierul &#039;&#039;&#039;&#039;&#039;cifre_romane.in&#039;&#039;&#039;&#039;&#039; conține un număr natural &#039;&#039;&#039;N&#039;&#039;&#039; scris cu cifre arabe.&lt;br /&gt;
&lt;br /&gt;
== Date de ieșire == &lt;br /&gt;
Dacă datele sunt introduse corect, pe ecran se va afișa: &lt;br /&gt;
&amp;quot;Datele sunt introduse corect.&amp;quot;, programul va afișa in fișierul &#039;&#039;&#039;&#039;&#039;cifre_romane.out&#039;&#039;&#039;&#039;&#039; va conține scrierea cu cifre romane a lui &#039;&#039;&#039;N&#039;&#039;&#039;. În cazul în care datele nu respectă restricțiile, se va afișa pe ecran: &amp;quot;Datele nu corespund restricțiilor impuse.&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
== Restricţii şi precizări ==&lt;br /&gt;
*1 ≤ &#039;&#039;&#039;n&#039;&#039;&#039; ≤ 3999&lt;br /&gt;
*cifrele romane sunt:&lt;br /&gt;
I=1&lt;br /&gt;
V=5&lt;br /&gt;
X=10&lt;br /&gt;
L=50&lt;br /&gt;
C=100&lt;br /&gt;
D=500&lt;br /&gt;
M=1000&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
== Exemple ==&lt;br /&gt;
===Exemplul 1===&lt;br /&gt;
; &#039;&#039;cifre_romane.in&#039;&#039;&lt;br /&gt;
:4&lt;br /&gt;
; &#039;&#039;Ecran&#039;&#039;&lt;br /&gt;
:Datele sunt introduse corect.&lt;br /&gt;
; &#039;&#039;cifre_romane.out&#039;&#039;&lt;br /&gt;
:IV&lt;br /&gt;
&lt;br /&gt;
=== Exemplul 2 ===&lt;br /&gt;
&lt;br /&gt;
; &#039;&#039;cifre_romane.in&#039;&#039;&lt;br /&gt;
:5&lt;br /&gt;
; &#039;&#039;Ecran&#039;&#039;&lt;br /&gt;
:Datele sunt introduse corect.&lt;br /&gt;
; &#039;&#039;cifre_romane.out&#039;&#039;&lt;br /&gt;
:V&lt;br /&gt;
&lt;br /&gt;
=== Exemplul 3 ===&lt;br /&gt;
; &#039;&#039;Intrare&#039;&#039;&lt;br /&gt;
: 4000&lt;br /&gt;
; &#039;&#039;Ieșire&#039;&#039;&lt;br /&gt;
: Datele nu corespund restricțiilor impuse.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Rezolvare == &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
# 3144 - Cifre Romane&lt;br /&gt;
def validare(n):&lt;br /&gt;
    if n &amp;lt; 1 or n &amp;gt; 3999:&lt;br /&gt;
        return False&lt;br /&gt;
    return True&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def transforma_in_romane(n):&lt;br /&gt;
    romane = [(1000, &#039;M&#039;), (900, &#039;CM&#039;), (500, &#039;D&#039;), (400, &#039;CD&#039;), (100, &#039;C&#039;),&lt;br /&gt;
              (90, &#039;XC&#039;), (50, &#039;L&#039;), (40, &#039;XL&#039;), (10, &#039;X&#039;), (9, &#039;IX&#039;),&lt;br /&gt;
              (5, &#039;V&#039;), (4, &#039;IV&#039;), (1, &#039;I&#039;)]&lt;br /&gt;
    rest = n&lt;br /&gt;
    rezultat = &#039;&#039;&lt;br /&gt;
    while rest &amp;gt; 0:&lt;br /&gt;
        for arab, roman in romane:&lt;br /&gt;
            while rest &amp;gt;= arab:&lt;br /&gt;
                rezultat += roman&lt;br /&gt;
                rest -= arab&lt;br /&gt;
    return rezultat&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def main():&lt;br /&gt;
    with open(&#039;cifre_romane.in&#039;, &#039;r&#039;) as f:&lt;br /&gt;
        n = int(f.readline().strip())&lt;br /&gt;
&lt;br /&gt;
    if not validare(n):&lt;br /&gt;
        print(&#039;Datele nu corespund restricțiilor impuse.&#039;)&lt;br /&gt;
    else:&lt;br /&gt;
        print(&#039;Datele sunt introduse corect.&#039;)&lt;br /&gt;
        rezultat = transforma_in_romane(n)&lt;br /&gt;
        with open(&#039;cifre_romane.out&#039;, &#039;w&#039;) as f:&lt;br /&gt;
            f.write(rezultat)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
if __name__ == &#039;__main__&#039;:&lt;br /&gt;
    main()&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Explicatie==&lt;br /&gt;
Funcția validare(n)&lt;br /&gt;
&lt;br /&gt;
Această funcție verifică dacă datele de intrare sunt valide. Are un singur parametru:&lt;br /&gt;
&lt;br /&gt;
n - numărul întreg care trebuie transformat în cifre romane&lt;br /&gt;
Funcția returnează True dacă datele sunt valide și False în caz contrar.&lt;br /&gt;
&lt;br /&gt;
Funcția transforma_in_romane(n)&lt;br /&gt;
&lt;br /&gt;
Această funcție primește un număr întreg n și returnează echivalentul în cifre romane ale acestuia. Funcția folosește o listă romane care conține tupluri cu perechile (arab, roman) pentru fiecare simbol din cifrele romane, în ordinea descrescătoare a valorii acestora. Apoi, se parcurge această listă de la început până la sfârșit și se adaugă în rezultat simbolul roman corespunzător valorii arabe până când se ajunge la finalul listei sau până când numărul întreg n devine 0.&lt;br /&gt;
&lt;br /&gt;
Funcția main()&lt;br /&gt;
&lt;br /&gt;
Această funcție este funcția principală a programului și este rulată atunci când scriptul Python este executat. Funcția deschide fișierul de intrare cifre_romane.in, citește numărul întreg care trebuie transformat în cifre romane, verifică dacă datele de intrare sunt valide cu ajutorul funcției validare(n), transformă numărul în cifre romane cu ajutorul funcției transforma_in_romane(n) și afișează rezultatul în fișierul de ieșire cifre_romane.out. Dacă datele de intrare nu corespund restricțiilor impuse, se afișează un mesaj de eroare.&lt;/div&gt;</summary>
		<author><name>Sovago Rares-Andrei</name></author>
	</entry>
	<entry>
		<id>https://wiki.universitas.ro/index.php?title=3144_-_Cifre_Romane&amp;diff=5507</id>
		<title>3144 - Cifre Romane</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=3144_-_Cifre_Romane&amp;diff=5507"/>
		<updated>2023-04-29T16:34:03Z</updated>

		<summary type="html">&lt;p&gt;Sovago Rares-Andrei: /* Exemplul 1 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Cerinţa ==&lt;br /&gt;
Alexandru a învățat azi despre numerele romane și cum se scriu acestea. Fiind distras de ce spuneau colegii a ajuns acasă și a realizat că nu știe cum să transforme un număr din cifre arabe în cifre romane. Deoarece a doua zi are un test numai din acest capitol, vă roagă să îl ajutați la transformarea unui număr &#039;&#039;&#039;N&#039;&#039;&#039; dat, scris cu cifre arabe în cifre romane.&lt;br /&gt;
== Date de intrare ==&lt;br /&gt;
Fișierul &#039;&#039;&#039;&#039;&#039;cifre_romane.in&#039;&#039;&#039;&#039;&#039; conține un număr natural &#039;&#039;&#039;N&#039;&#039;&#039; scris cu cifre arabe.&lt;br /&gt;
&lt;br /&gt;
== Date de ieșire == &lt;br /&gt;
Dacă datele sunt introduse corect, pe ecran se va afișa: &lt;br /&gt;
&amp;quot;Datele sunt introduse corect.&amp;quot;, programul va afișa in fișierul &#039;&#039;&#039;&#039;&#039;cifre_romane.out&#039;&#039;&#039;&#039;&#039; va conține scrierea cu cifre romane a lui &#039;&#039;&#039;N&#039;&#039;&#039;. În cazul în care datele nu respectă restricțiile, se va afișa pe ecran: &amp;quot;Datele nu corespund restricțiilor impuse.&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
== Restricţii şi precizări ==&lt;br /&gt;
*1 ≤ &#039;&#039;&#039;n&#039;&#039;&#039; ≤ 3999&lt;br /&gt;
*cifrele romane sunt:&lt;br /&gt;
I=1&lt;br /&gt;
V=5&lt;br /&gt;
X=10&lt;br /&gt;
L=50&lt;br /&gt;
C=100&lt;br /&gt;
D=500&lt;br /&gt;
M=1000&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
== Exemple ==&lt;br /&gt;
===Exemplul 1===&lt;br /&gt;
; &#039;&#039;cifre_romane.in&#039;&#039;&lt;br /&gt;
:4&lt;br /&gt;
; &#039;&#039;Ecran&#039;&#039;&lt;br /&gt;
:Datele sunt introduse corect.&lt;br /&gt;
; &#039;&#039;cifre_romane.out&#039;&#039;&lt;br /&gt;
:IV&lt;br /&gt;
&lt;br /&gt;
=== Exemplul 2 ===&lt;br /&gt;
; &#039;&#039;Intrare&#039;&#039;&lt;br /&gt;
: 5&lt;br /&gt;
; &#039;&#039;Ieșire&#039;&#039;&lt;br /&gt;
: Datele sunt introduse corect.&lt;br /&gt;
: V&lt;br /&gt;
&lt;br /&gt;
=== Exemplul 3 ===&lt;br /&gt;
; &#039;&#039;Intrare&#039;&#039;&lt;br /&gt;
: 4000&lt;br /&gt;
; &#039;&#039;Ieșire&#039;&#039;&lt;br /&gt;
: Datele nu corespund restricțiilor impuse.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Rezolvare == &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
# 3144 - Cifre Romane&lt;br /&gt;
def validare(n):&lt;br /&gt;
    if n &amp;lt; 1 or n &amp;gt; 3999:&lt;br /&gt;
        return False&lt;br /&gt;
    return True&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def transforma_in_romane(n):&lt;br /&gt;
    romane = [(1000, &#039;M&#039;), (900, &#039;CM&#039;), (500, &#039;D&#039;), (400, &#039;CD&#039;), (100, &#039;C&#039;),&lt;br /&gt;
              (90, &#039;XC&#039;), (50, &#039;L&#039;), (40, &#039;XL&#039;), (10, &#039;X&#039;), (9, &#039;IX&#039;),&lt;br /&gt;
              (5, &#039;V&#039;), (4, &#039;IV&#039;), (1, &#039;I&#039;)]&lt;br /&gt;
    rest = n&lt;br /&gt;
    rezultat = &#039;&#039;&lt;br /&gt;
    while rest &amp;gt; 0:&lt;br /&gt;
        for arab, roman in romane:&lt;br /&gt;
            while rest &amp;gt;= arab:&lt;br /&gt;
                rezultat += roman&lt;br /&gt;
                rest -= arab&lt;br /&gt;
    return rezultat&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def main():&lt;br /&gt;
    with open(&#039;cifre_romane.in&#039;, &#039;r&#039;) as f:&lt;br /&gt;
        n = int(f.readline().strip())&lt;br /&gt;
&lt;br /&gt;
    if not validare(n):&lt;br /&gt;
        print(&#039;Datele nu corespund restricțiilor impuse.&#039;)&lt;br /&gt;
    else:&lt;br /&gt;
        print(&#039;Datele sunt introduse corect.&#039;)&lt;br /&gt;
        rezultat = transforma_in_romane(n)&lt;br /&gt;
        with open(&#039;cifre_romane.out&#039;, &#039;w&#039;) as f:&lt;br /&gt;
            f.write(rezultat)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
if __name__ == &#039;__main__&#039;:&lt;br /&gt;
    main()&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Explicatie==&lt;br /&gt;
Funcția validare(n)&lt;br /&gt;
&lt;br /&gt;
Această funcție verifică dacă datele de intrare sunt valide. Are un singur parametru:&lt;br /&gt;
&lt;br /&gt;
n - numărul întreg care trebuie transformat în cifre romane&lt;br /&gt;
Funcția returnează True dacă datele sunt valide și False în caz contrar.&lt;br /&gt;
&lt;br /&gt;
Funcția transforma_in_romane(n)&lt;br /&gt;
&lt;br /&gt;
Această funcție primește un număr întreg n și returnează echivalentul în cifre romane ale acestuia. Funcția folosește o listă romane care conține tupluri cu perechile (arab, roman) pentru fiecare simbol din cifrele romane, în ordinea descrescătoare a valorii acestora. Apoi, se parcurge această listă de la început până la sfârșit și se adaugă în rezultat simbolul roman corespunzător valorii arabe până când se ajunge la finalul listei sau până când numărul întreg n devine 0.&lt;br /&gt;
&lt;br /&gt;
Funcția main()&lt;br /&gt;
&lt;br /&gt;
Această funcție este funcția principală a programului și este rulată atunci când scriptul Python este executat. Funcția deschide fișierul de intrare cifre_romane.in, citește numărul întreg care trebuie transformat în cifre romane, verifică dacă datele de intrare sunt valide cu ajutorul funcției validare(n), transformă numărul în cifre romane cu ajutorul funcției transforma_in_romane(n) și afișează rezultatul în fișierul de ieșire cifre_romane.out. Dacă datele de intrare nu corespund restricțiilor impuse, se afișează un mesaj de eroare.&lt;/div&gt;</summary>
		<author><name>Sovago Rares-Andrei</name></author>
	</entry>
	<entry>
		<id>https://wiki.universitas.ro/index.php?title=3144_-_Cifre_Romane&amp;diff=5506</id>
		<title>3144 - Cifre Romane</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=3144_-_Cifre_Romane&amp;diff=5506"/>
		<updated>2023-04-29T16:32:04Z</updated>

		<summary type="html">&lt;p&gt;Sovago Rares-Andrei: /* Date de ieșire */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Cerinţa ==&lt;br /&gt;
Alexandru a învățat azi despre numerele romane și cum se scriu acestea. Fiind distras de ce spuneau colegii a ajuns acasă și a realizat că nu știe cum să transforme un număr din cifre arabe în cifre romane. Deoarece a doua zi are un test numai din acest capitol, vă roagă să îl ajutați la transformarea unui număr &#039;&#039;&#039;N&#039;&#039;&#039; dat, scris cu cifre arabe în cifre romane.&lt;br /&gt;
== Date de intrare ==&lt;br /&gt;
Fișierul &#039;&#039;&#039;&#039;&#039;cifre_romane.in&#039;&#039;&#039;&#039;&#039; conține un număr natural &#039;&#039;&#039;N&#039;&#039;&#039; scris cu cifre arabe.&lt;br /&gt;
&lt;br /&gt;
== Date de ieșire == &lt;br /&gt;
Dacă datele sunt introduse corect, pe ecran se va afișa: &lt;br /&gt;
&amp;quot;Datele sunt introduse corect.&amp;quot;, programul va afișa in fișierul &#039;&#039;&#039;&#039;&#039;cifre_romane.out&#039;&#039;&#039;&#039;&#039; va conține scrierea cu cifre romane a lui &#039;&#039;&#039;N&#039;&#039;&#039;. În cazul în care datele nu respectă restricțiile, se va afișa pe ecran: &amp;quot;Datele nu corespund restricțiilor impuse.&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
== Restricţii şi precizări ==&lt;br /&gt;
*1 ≤ &#039;&#039;&#039;n&#039;&#039;&#039; ≤ 3999&lt;br /&gt;
*cifrele romane sunt:&lt;br /&gt;
I=1&lt;br /&gt;
V=5&lt;br /&gt;
X=10&lt;br /&gt;
L=50&lt;br /&gt;
C=100&lt;br /&gt;
D=500&lt;br /&gt;
M=1000&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
== Exemple ==&lt;br /&gt;
===Exemplul 1===&lt;br /&gt;
; &#039;&#039;Intrare&#039;&#039;&lt;br /&gt;
:4&lt;br /&gt;
; &#039;&#039;Ieșire&#039;&#039;&lt;br /&gt;
:Datele sunt introduse corect.&lt;br /&gt;
:IV&lt;br /&gt;
=== Exemplul 2 ===&lt;br /&gt;
; &#039;&#039;Intrare&#039;&#039;&lt;br /&gt;
: 5&lt;br /&gt;
; &#039;&#039;Ieșire&#039;&#039;&lt;br /&gt;
: Datele sunt introduse corect.&lt;br /&gt;
: V&lt;br /&gt;
&lt;br /&gt;
=== Exemplul 3 ===&lt;br /&gt;
; &#039;&#039;Intrare&#039;&#039;&lt;br /&gt;
: 4000&lt;br /&gt;
; &#039;&#039;Ieșire&#039;&#039;&lt;br /&gt;
: Datele nu corespund restricțiilor impuse.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Rezolvare == &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
# 3144 - Cifre Romane&lt;br /&gt;
def validare(n):&lt;br /&gt;
    if n &amp;lt; 1 or n &amp;gt; 3999:&lt;br /&gt;
        return False&lt;br /&gt;
    return True&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def transforma_in_romane(n):&lt;br /&gt;
    romane = [(1000, &#039;M&#039;), (900, &#039;CM&#039;), (500, &#039;D&#039;), (400, &#039;CD&#039;), (100, &#039;C&#039;),&lt;br /&gt;
              (90, &#039;XC&#039;), (50, &#039;L&#039;), (40, &#039;XL&#039;), (10, &#039;X&#039;), (9, &#039;IX&#039;),&lt;br /&gt;
              (5, &#039;V&#039;), (4, &#039;IV&#039;), (1, &#039;I&#039;)]&lt;br /&gt;
    rest = n&lt;br /&gt;
    rezultat = &#039;&#039;&lt;br /&gt;
    while rest &amp;gt; 0:&lt;br /&gt;
        for arab, roman in romane:&lt;br /&gt;
            while rest &amp;gt;= arab:&lt;br /&gt;
                rezultat += roman&lt;br /&gt;
                rest -= arab&lt;br /&gt;
    return rezultat&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def main():&lt;br /&gt;
    with open(&#039;cifre_romane.in&#039;, &#039;r&#039;) as f:&lt;br /&gt;
        n = int(f.readline().strip())&lt;br /&gt;
&lt;br /&gt;
    if not validare(n):&lt;br /&gt;
        print(&#039;Datele nu corespund restricțiilor impuse.&#039;)&lt;br /&gt;
    else:&lt;br /&gt;
        print(&#039;Datele sunt introduse corect.&#039;)&lt;br /&gt;
        rezultat = transforma_in_romane(n)&lt;br /&gt;
        with open(&#039;cifre_romane.out&#039;, &#039;w&#039;) as f:&lt;br /&gt;
            f.write(rezultat)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
if __name__ == &#039;__main__&#039;:&lt;br /&gt;
    main()&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Explicatie==&lt;br /&gt;
Funcția validare(n)&lt;br /&gt;
&lt;br /&gt;
Această funcție verifică dacă datele de intrare sunt valide. Are un singur parametru:&lt;br /&gt;
&lt;br /&gt;
n - numărul întreg care trebuie transformat în cifre romane&lt;br /&gt;
Funcția returnează True dacă datele sunt valide și False în caz contrar.&lt;br /&gt;
&lt;br /&gt;
Funcția transforma_in_romane(n)&lt;br /&gt;
&lt;br /&gt;
Această funcție primește un număr întreg n și returnează echivalentul în cifre romane ale acestuia. Funcția folosește o listă romane care conține tupluri cu perechile (arab, roman) pentru fiecare simbol din cifrele romane, în ordinea descrescătoare a valorii acestora. Apoi, se parcurge această listă de la început până la sfârșit și se adaugă în rezultat simbolul roman corespunzător valorii arabe până când se ajunge la finalul listei sau până când numărul întreg n devine 0.&lt;br /&gt;
&lt;br /&gt;
Funcția main()&lt;br /&gt;
&lt;br /&gt;
Această funcție este funcția principală a programului și este rulată atunci când scriptul Python este executat. Funcția deschide fișierul de intrare cifre_romane.in, citește numărul întreg care trebuie transformat în cifre romane, verifică dacă datele de intrare sunt valide cu ajutorul funcției validare(n), transformă numărul în cifre romane cu ajutorul funcției transforma_in_romane(n) și afișează rezultatul în fișierul de ieșire cifre_romane.out. Dacă datele de intrare nu corespund restricțiilor impuse, se afișează un mesaj de eroare.&lt;/div&gt;</summary>
		<author><name>Sovago Rares-Andrei</name></author>
	</entry>
	<entry>
		<id>https://wiki.universitas.ro/index.php?title=3144_-_Cifre_Romane&amp;diff=5505</id>
		<title>3144 - Cifre Romane</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=3144_-_Cifre_Romane&amp;diff=5505"/>
		<updated>2023-04-29T16:31:47Z</updated>

		<summary type="html">&lt;p&gt;Sovago Rares-Andrei: /* Date de intrare */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Cerinţa ==&lt;br /&gt;
Alexandru a învățat azi despre numerele romane și cum se scriu acestea. Fiind distras de ce spuneau colegii a ajuns acasă și a realizat că nu știe cum să transforme un număr din cifre arabe în cifre romane. Deoarece a doua zi are un test numai din acest capitol, vă roagă să îl ajutați la transformarea unui număr &#039;&#039;&#039;N&#039;&#039;&#039; dat, scris cu cifre arabe în cifre romane.&lt;br /&gt;
== Date de intrare ==&lt;br /&gt;
Fișierul &#039;&#039;&#039;&#039;&#039;cifre_romane.in&#039;&#039;&#039;&#039;&#039; conține un număr natural &#039;&#039;&#039;N&#039;&#039;&#039; scris cu cifre arabe.&lt;br /&gt;
&lt;br /&gt;
== Date de ieșire == &lt;br /&gt;
Dacă datele sunt introduse corect, pe ecran se va afișa: &lt;br /&gt;
&amp;quot;Datele sunt introduse corect.&amp;quot;, programul va afișa in fișierul &#039;&#039;cifre_romane.out&#039;&#039; va conține scrierea cu cifre romane a lui &#039;&#039;&#039;N&#039;&#039;&#039;. În cazul în care datele nu respectă restricțiile, se va afișa pe ecran: &amp;quot;Datele nu corespund restricțiilor impuse.&amp;quot;.&lt;br /&gt;
== Restricţii şi precizări ==&lt;br /&gt;
*1 ≤ &#039;&#039;&#039;n&#039;&#039;&#039; ≤ 3999&lt;br /&gt;
*cifrele romane sunt:&lt;br /&gt;
I=1&lt;br /&gt;
V=5&lt;br /&gt;
X=10&lt;br /&gt;
L=50&lt;br /&gt;
C=100&lt;br /&gt;
D=500&lt;br /&gt;
M=1000&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
== Exemple ==&lt;br /&gt;
===Exemplul 1===&lt;br /&gt;
; &#039;&#039;Intrare&#039;&#039;&lt;br /&gt;
:4&lt;br /&gt;
; &#039;&#039;Ieșire&#039;&#039;&lt;br /&gt;
:Datele sunt introduse corect.&lt;br /&gt;
:IV&lt;br /&gt;
=== Exemplul 2 ===&lt;br /&gt;
; &#039;&#039;Intrare&#039;&#039;&lt;br /&gt;
: 5&lt;br /&gt;
; &#039;&#039;Ieșire&#039;&#039;&lt;br /&gt;
: Datele sunt introduse corect.&lt;br /&gt;
: V&lt;br /&gt;
&lt;br /&gt;
=== Exemplul 3 ===&lt;br /&gt;
; &#039;&#039;Intrare&#039;&#039;&lt;br /&gt;
: 4000&lt;br /&gt;
; &#039;&#039;Ieșire&#039;&#039;&lt;br /&gt;
: Datele nu corespund restricțiilor impuse.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Rezolvare == &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
# 3144 - Cifre Romane&lt;br /&gt;
def validare(n):&lt;br /&gt;
    if n &amp;lt; 1 or n &amp;gt; 3999:&lt;br /&gt;
        return False&lt;br /&gt;
    return True&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def transforma_in_romane(n):&lt;br /&gt;
    romane = [(1000, &#039;M&#039;), (900, &#039;CM&#039;), (500, &#039;D&#039;), (400, &#039;CD&#039;), (100, &#039;C&#039;),&lt;br /&gt;
              (90, &#039;XC&#039;), (50, &#039;L&#039;), (40, &#039;XL&#039;), (10, &#039;X&#039;), (9, &#039;IX&#039;),&lt;br /&gt;
              (5, &#039;V&#039;), (4, &#039;IV&#039;), (1, &#039;I&#039;)]&lt;br /&gt;
    rest = n&lt;br /&gt;
    rezultat = &#039;&#039;&lt;br /&gt;
    while rest &amp;gt; 0:&lt;br /&gt;
        for arab, roman in romane:&lt;br /&gt;
            while rest &amp;gt;= arab:&lt;br /&gt;
                rezultat += roman&lt;br /&gt;
                rest -= arab&lt;br /&gt;
    return rezultat&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def main():&lt;br /&gt;
    with open(&#039;cifre_romane.in&#039;, &#039;r&#039;) as f:&lt;br /&gt;
        n = int(f.readline().strip())&lt;br /&gt;
&lt;br /&gt;
    if not validare(n):&lt;br /&gt;
        print(&#039;Datele nu corespund restricțiilor impuse.&#039;)&lt;br /&gt;
    else:&lt;br /&gt;
        print(&#039;Datele sunt introduse corect.&#039;)&lt;br /&gt;
        rezultat = transforma_in_romane(n)&lt;br /&gt;
        with open(&#039;cifre_romane.out&#039;, &#039;w&#039;) as f:&lt;br /&gt;
            f.write(rezultat)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
if __name__ == &#039;__main__&#039;:&lt;br /&gt;
    main()&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Explicatie==&lt;br /&gt;
Funcția validare(n)&lt;br /&gt;
&lt;br /&gt;
Această funcție verifică dacă datele de intrare sunt valide. Are un singur parametru:&lt;br /&gt;
&lt;br /&gt;
n - numărul întreg care trebuie transformat în cifre romane&lt;br /&gt;
Funcția returnează True dacă datele sunt valide și False în caz contrar.&lt;br /&gt;
&lt;br /&gt;
Funcția transforma_in_romane(n)&lt;br /&gt;
&lt;br /&gt;
Această funcție primește un număr întreg n și returnează echivalentul în cifre romane ale acestuia. Funcția folosește o listă romane care conține tupluri cu perechile (arab, roman) pentru fiecare simbol din cifrele romane, în ordinea descrescătoare a valorii acestora. Apoi, se parcurge această listă de la început până la sfârșit și se adaugă în rezultat simbolul roman corespunzător valorii arabe până când se ajunge la finalul listei sau până când numărul întreg n devine 0.&lt;br /&gt;
&lt;br /&gt;
Funcția main()&lt;br /&gt;
&lt;br /&gt;
Această funcție este funcția principală a programului și este rulată atunci când scriptul Python este executat. Funcția deschide fișierul de intrare cifre_romane.in, citește numărul întreg care trebuie transformat în cifre romane, verifică dacă datele de intrare sunt valide cu ajutorul funcției validare(n), transformă numărul în cifre romane cu ajutorul funcției transforma_in_romane(n) și afișează rezultatul în fișierul de ieșire cifre_romane.out. Dacă datele de intrare nu corespund restricțiilor impuse, se afișează un mesaj de eroare.&lt;/div&gt;</summary>
		<author><name>Sovago Rares-Andrei</name></author>
	</entry>
	<entry>
		<id>https://wiki.universitas.ro/index.php?title=4092_-_cate&amp;diff=5504</id>
		<title>4092 - cate</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=4092_-_cate&amp;diff=5504"/>
		<updated>2023-04-29T16:28:36Z</updated>

		<summary type="html">&lt;p&gt;Sovago Rares-Andrei: /* Date de ieșire */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Cerința==&lt;br /&gt;
&lt;br /&gt;
Se dă &#039;&#039;&#039;&amp;quot;n&amp;quot;&#039;&#039;&#039;, un număr natural și &#039;&#039;&#039;&amp;quot;n&amp;quot;&#039;&#039;&#039; perechi de numere &#039;&#039;&#039;(&amp;quot;a&amp;quot;, &amp;quot;b&amp;quot;)&#039;&#039;&#039;. Să se determine:&lt;br /&gt;
&lt;br /&gt;
Câte numere din intervalul închis determinat de &#039;&#039;&#039;&amp;quot;a&amp;quot;&#039;&#039;&#039; și &#039;&#039;&#039;&amp;quot;b&amp;quot;&#039;&#039;&#039; au număr impar de divizori pozitivi.&lt;br /&gt;
Câte numere cu exact trei divizori pozitivi se găsesc în intervalul închis determinat de &#039;&#039;&#039;&amp;quot;a&amp;quot;&#039;&#039;&#039; și &#039;&#039;&#039;&amp;quot;b&amp;quot;&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
==Date de intrare==&lt;br /&gt;
&lt;br /&gt;
Fișierul de intrare &#039;&#039;&#039;&amp;quot;cate.in&amp;quot;&#039;&#039;&#039; conține pe prima linie două numere naturale &amp;quot;C&amp;quot; și &amp;quot;n&amp;quot;, separate printr-un spațiu. &amp;quot;C&amp;quot; reprezintă cerința care trebuie rezolvată (1 sau 2), iar &amp;quot;n&amp;quot; reprezintă numărul de perechi. Pe următoarele &amp;quot;n&amp;quot; linii se găsesc cele &amp;quot;n&amp;quot; perechi de numere naturale, separate prin câte un spațiu.&lt;br /&gt;
&lt;br /&gt;
==Date de ieșire==&lt;br /&gt;
&lt;br /&gt;
Dacă datele sunt introduse corect, pe ecran se va afișa: &amp;quot;Datele sunt introduse corect.&amp;quot;. Fișierul de ieșire &#039;&#039;&#039;&amp;quot;cate.out&amp;quot;&#039;&#039;&#039; va conține &amp;quot;n&amp;quot; linii. Pe linia &amp;quot;i&amp;quot; trebuie să se găsească răspunsul la întrebarea corespunzătoare de pe linia &amp;quot;i+1&amp;quot; a fișierului de intrare. În cazul în care datele nu respectă restricțiile, se va afișa: &amp;quot;Datele nu corespund restricțiilor impuse.&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
== Restricţii şi precizări ==&lt;br /&gt;
*1 ≤ n ≤ 100.000&lt;br /&gt;
*1 ≤ a, b ≤ 1.000.000&lt;br /&gt;
*Pentru 42 de puncte, C = 1&lt;br /&gt;
*Pentru 58 de puncte, C = 2&lt;br /&gt;
== Exemple ==&lt;br /&gt;
===Exemplul 1===&lt;br /&gt;
; &#039;&#039;cate.in&#039;&#039;&lt;br /&gt;
:2 3&lt;br /&gt;
:1 10&lt;br /&gt;
:30 10&lt;br /&gt;
:100 500&lt;br /&gt;
; &#039;&#039;ecran&#039;&#039;&lt;br /&gt;
:Datele sunt introduse corect.&lt;br /&gt;
; &#039;&#039;cate.out&#039;&#039;&lt;br /&gt;
:2&lt;br /&gt;
:1&lt;br /&gt;
:4&lt;br /&gt;
&lt;br /&gt;
===Exemplul 2===&lt;br /&gt;
===Exemplul 1===&lt;br /&gt;
; &#039;&#039;cate.in&#039;&#039;&lt;br /&gt;
:1 3&lt;br /&gt;
:1 10&lt;br /&gt;
:30 10&lt;br /&gt;
:100 500&lt;br /&gt;
; &#039;&#039;ecran&#039;&#039;&lt;br /&gt;
:Datele sunt introduse corect.&lt;br /&gt;
; &#039;&#039;cate.out&#039;&#039;&lt;br /&gt;
:3&lt;br /&gt;
:2&lt;br /&gt;
:13&lt;br /&gt;
===Exemplul 3===&lt;br /&gt;
; &#039;&#039;cate.in&#039;&#039;&lt;br /&gt;
:1 3&lt;br /&gt;
:1 10&lt;br /&gt;
:30 10&lt;br /&gt;
:100 500000000&lt;br /&gt;
; &#039;&#039;ecran&#039;&#039;&lt;br /&gt;
:Datele nu corespund restricțiilor impuse.&lt;br /&gt;
; &#039;&#039;cate.out&#039;&#039;&lt;br /&gt;
:&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Rezolvare == &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
# 4092 - cate&lt;br /&gt;
import sys&lt;br /&gt;
import math&lt;br /&gt;
&lt;br /&gt;
def valideaza_datele(cerinta, numar_teste, teste):&lt;br /&gt;
    if cerinta not in [1, 2]:&lt;br /&gt;
        return &amp;quot;Datele nu corespund restricțiilor impuse.&amp;quot;&lt;br /&gt;
    if numar_teste != len(teste):&lt;br /&gt;
        return &amp;quot;Datele nu corespund restricțiilor impuse.&amp;quot;&lt;br /&gt;
    for test in teste:&lt;br /&gt;
        a, b = test&lt;br /&gt;
        if a &amp;lt; 1 or a &amp;gt; 1000000 or b &amp;lt; 1 or b &amp;gt; 1000000:&lt;br /&gt;
            return &amp;quot;Datele nu corespund restricțiilor impuse.&amp;quot;&lt;br /&gt;
    return &amp;quot;Datele sunt introduse corect.&amp;quot;&lt;br /&gt;
&lt;br /&gt;
def rezolva_cerinta_1(teste):&lt;br /&gt;
    rezultate = []&lt;br /&gt;
    for test in teste:&lt;br /&gt;
        a, b = sorted(test)&lt;br /&gt;
        if a &amp;gt; b:&lt;br /&gt;
            rezultate.append(0)&lt;br /&gt;
        else:&lt;br /&gt;
            rezultate.append(int(math.sqrt(b)) - int(math.sqrt(a - 1)))&lt;br /&gt;
    return rezultate&lt;br /&gt;
&lt;br /&gt;
def rezolva_cerinta_2(teste):&lt;br /&gt;
    numere_prime = [True] * 1000001&lt;br /&gt;
    numere_prime[0] = numere_prime[1] = False&lt;br /&gt;
    prefix_suma = [0] * 1000001&lt;br /&gt;
    for i in range(2, 1001):&lt;br /&gt;
        if numere_prime[i]:&lt;br /&gt;
            prefix_suma[i * i] = 1&lt;br /&gt;
            for j in range(i * i, 1000001, i):&lt;br /&gt;
                numere_prime[j] = False&lt;br /&gt;
    for i in range(1, 1000001):&lt;br /&gt;
        prefix_suma[i] += prefix_suma[i - 1]&lt;br /&gt;
&lt;br /&gt;
    rezultate = []&lt;br /&gt;
    for test in teste:&lt;br /&gt;
        a, b = sorted(test)&lt;br /&gt;
        rezultate.append(prefix_suma[b] - prefix_suma[a - 1])&lt;br /&gt;
    return rezultate&lt;br /&gt;
&lt;br /&gt;
if __name__ == &#039;__main__&#039;:&lt;br /&gt;
    with open(&amp;quot;cate.in&amp;quot;, &amp;quot;r&amp;quot;) as fisier_intrare:&lt;br /&gt;
        cerinta, numar_teste = map(int, fisier_intrare.readline().split())&lt;br /&gt;
        teste = []&lt;br /&gt;
        for _ in range(numar_teste):&lt;br /&gt;
            a, b = map(int, fisier_intrare.readline().split())&lt;br /&gt;
            teste.append((a, b))&lt;br /&gt;
&lt;br /&gt;
    rezultat_validare = valideaza_datele(cerinta, numar_teste, teste)&lt;br /&gt;
    if rezultat_validare != &amp;quot;Datele sunt introduse corect.&amp;quot;:&lt;br /&gt;
        print(rezultat_validare)&lt;br /&gt;
    else:&lt;br /&gt;
        if cerinta == 1:&lt;br /&gt;
            rezultate = rezolva_cerinta_1(teste)&lt;br /&gt;
        else:&lt;br /&gt;
            rezultate = rezolva_cerinta_2(teste)&lt;br /&gt;
&lt;br /&gt;
        with open(&amp;quot;cate.out&amp;quot;, &amp;quot;w&amp;quot;) as fisier_iesire:&lt;br /&gt;
            for rezultat in rezultate:&lt;br /&gt;
                fisier_iesire.write(str(rezultat) + &amp;quot;\n&amp;quot;)&lt;br /&gt;
        print(&amp;quot;Datele sunt introduse corect.&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Explicatie==&lt;br /&gt;
&lt;br /&gt;
valideaza_datele(cerinta, numar_teste, teste): Această funcție primește ca parametri cerința de rezolvat (cerinta), numărul de teste (numar_teste) și o listă de teste (teste). Ea verifică dacă datele introduse sunt valide conform cerințelor impuse. Mai întâi verifică dacă cerința este 1 sau 2 și apoi verifică dacă numărul de teste coincide cu numărul de teste introduse în listă. În cele din urmă, se verifică dacă valorile a și b din fiecare test sunt în intervalul [1, 1000000]. Dacă datele sunt introduse corect, funcția returnează un mesaj de confirmare, altfel returnează un mesaj de eroare.&lt;br /&gt;
&lt;br /&gt;
rezolva_cerinta_1(teste): Această funcție primește ca parametru o listă de teste (teste) pentru cerința 1. Pentru fiecare test din listă, funcția sortează valorile a și b și calculează diferența dintre rădăcina pătrată a lui b și rădăcina pătrată a lui a-1. În cele din urmă, rezultatele sunt stocate într-o listă și returnate.&lt;br /&gt;
&lt;br /&gt;
rezolva_cerinta_2(teste): Această funcție primește ca parametru o listă de teste (teste) pentru cerința 2. Funcția calculează, pentru fiecare număr între 2 și 1000000, dacă este prim sau nu. Această informație este stocată într-o listă de booleni numită numere_prime, în care valoarea True indică faptul că numărul este prim, iar valoarea False indică faptul că numărul nu este prim. De asemenea, funcția calculează un prefix-sum pentru această listă. Acest prefix-sum se numește prefix_suma și este folosit pentru a calcula rapid câte numere prime sunt într-un interval dat. Mai întâi, pentru fiecare pătrat al unui număr prim, se pune o valoare de 1 în prefix_suma, indicând faptul că acel număr prim se află în intervalul [pătratul lui i, 1000000]. Apoi, pentru fiecare număr între 1 și 1000000, se adaugă valoarea precedentă din prefix_suma la valoarea curentă, astfel încât prefix_suma devine un prefix-sum pentru numărul de numere prime din intervalul [1, i]. Pentru fiecare test din listă, funcția sortează valorile a și b și calculează diferența dintre prefix-suma lui b și prefix-suma lui a-1. În cele din urmă, rezultatele sunt stocate într-o lista&lt;br /&gt;
&lt;br /&gt;
Funcția main este funcția principală a programului, care coordonează executarea acestuia. Ea verifică dacă programul este rulat ca script, sau este importat ca modul, prin intermediul instrucțiunii if __name__ == &#039;__main__&#039;:.&lt;br /&gt;
&lt;br /&gt;
Dacă programul este rulat ca script, atunci această instrucțiune va fi adevărată, iar codul din interiorul acesteia va fi executat. În acest caz, se deschide fișierul de intrare &amp;quot;cate.in&amp;quot; pentru citire, se citește prima linie pentru a obține cerința (cerinta) și numărul de teste (numar_teste), iar apoi se citește fiecare test și se stochează în lista teste. Aceste valori sunt folosite pentru a apela funcția valideaza_datele(cerinta, numar_teste, teste), care verifică dacă datele introduse sunt valide conform cerințelor impuse. Dacă datele sunt valide, atunci se apelează funcția corespunzătoare pentru a rezolva problema, fie rezolva_cerinta_1(teste) sau rezolva_cerinta_2(teste), în funcție de cerință. Rezultatele sunt stocate în lista rezultate, care este scrisă în fișierul de ieșire &amp;quot;cate.out&amp;quot;, iar apoi se afișează un mesaj de confirmare a introducerii corecte a datelor.&lt;br /&gt;
&lt;br /&gt;
Dacă programul este importat ca modul, atunci instrucțiunea if __name__ == &#039;__main__&#039;: este falsă, iar codul din interiorul acesteia nu va fi executat. În acest caz, funcția main poate fi apelată din alt modul, pentru a rezolva problema cu datele date în parametrii funcției.&lt;/div&gt;</summary>
		<author><name>Sovago Rares-Andrei</name></author>
	</entry>
	<entry>
		<id>https://wiki.universitas.ro/index.php?title=4092_-_cate&amp;diff=5503</id>
		<title>4092 - cate</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=4092_-_cate&amp;diff=5503"/>
		<updated>2023-04-29T16:28:18Z</updated>

		<summary type="html">&lt;p&gt;Sovago Rares-Andrei: /* Date de intrare */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Cerința==&lt;br /&gt;
&lt;br /&gt;
Se dă &#039;&#039;&#039;&amp;quot;n&amp;quot;&#039;&#039;&#039;, un număr natural și &#039;&#039;&#039;&amp;quot;n&amp;quot;&#039;&#039;&#039; perechi de numere &#039;&#039;&#039;(&amp;quot;a&amp;quot;, &amp;quot;b&amp;quot;)&#039;&#039;&#039;. Să se determine:&lt;br /&gt;
&lt;br /&gt;
Câte numere din intervalul închis determinat de &#039;&#039;&#039;&amp;quot;a&amp;quot;&#039;&#039;&#039; și &#039;&#039;&#039;&amp;quot;b&amp;quot;&#039;&#039;&#039; au număr impar de divizori pozitivi.&lt;br /&gt;
Câte numere cu exact trei divizori pozitivi se găsesc în intervalul închis determinat de &#039;&#039;&#039;&amp;quot;a&amp;quot;&#039;&#039;&#039; și &#039;&#039;&#039;&amp;quot;b&amp;quot;&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
==Date de intrare==&lt;br /&gt;
&lt;br /&gt;
Fișierul de intrare &#039;&#039;&#039;&amp;quot;cate.in&amp;quot;&#039;&#039;&#039; conține pe prima linie două numere naturale &amp;quot;C&amp;quot; și &amp;quot;n&amp;quot;, separate printr-un spațiu. &amp;quot;C&amp;quot; reprezintă cerința care trebuie rezolvată (1 sau 2), iar &amp;quot;n&amp;quot; reprezintă numărul de perechi. Pe următoarele &amp;quot;n&amp;quot; linii se găsesc cele &amp;quot;n&amp;quot; perechi de numere naturale, separate prin câte un spațiu.&lt;br /&gt;
&lt;br /&gt;
==Date de ieșire==&lt;br /&gt;
&lt;br /&gt;
Dacă datele sunt introduse corect, pe ecran se va afișa: &amp;quot;Datele sunt introduse corect.&amp;quot;. Fișierul de ieșire &amp;quot;cate.out&amp;quot; va conține &amp;quot;n&amp;quot; linii. Pe linia &amp;quot;i&amp;quot; trebuie să se găsească răspunsul la întrebarea corespunzătoare de pe linia &amp;quot;i+1&amp;quot; a fișierului de intrare. În cazul în care datele nu respectă restricțiile, se va afișa: &amp;quot;Datele nu corespund restricțiilor impuse.&amp;quot;.&lt;br /&gt;
== Restricţii şi precizări ==&lt;br /&gt;
*1 ≤ n ≤ 100.000&lt;br /&gt;
*1 ≤ a, b ≤ 1.000.000&lt;br /&gt;
*Pentru 42 de puncte, C = 1&lt;br /&gt;
*Pentru 58 de puncte, C = 2&lt;br /&gt;
== Exemple ==&lt;br /&gt;
===Exemplul 1===&lt;br /&gt;
; &#039;&#039;cate.in&#039;&#039;&lt;br /&gt;
:2 3&lt;br /&gt;
:1 10&lt;br /&gt;
:30 10&lt;br /&gt;
:100 500&lt;br /&gt;
; &#039;&#039;ecran&#039;&#039;&lt;br /&gt;
:Datele sunt introduse corect.&lt;br /&gt;
; &#039;&#039;cate.out&#039;&#039;&lt;br /&gt;
:2&lt;br /&gt;
:1&lt;br /&gt;
:4&lt;br /&gt;
&lt;br /&gt;
===Exemplul 2===&lt;br /&gt;
===Exemplul 1===&lt;br /&gt;
; &#039;&#039;cate.in&#039;&#039;&lt;br /&gt;
:1 3&lt;br /&gt;
:1 10&lt;br /&gt;
:30 10&lt;br /&gt;
:100 500&lt;br /&gt;
; &#039;&#039;ecran&#039;&#039;&lt;br /&gt;
:Datele sunt introduse corect.&lt;br /&gt;
; &#039;&#039;cate.out&#039;&#039;&lt;br /&gt;
:3&lt;br /&gt;
:2&lt;br /&gt;
:13&lt;br /&gt;
===Exemplul 3===&lt;br /&gt;
; &#039;&#039;cate.in&#039;&#039;&lt;br /&gt;
:1 3&lt;br /&gt;
:1 10&lt;br /&gt;
:30 10&lt;br /&gt;
:100 500000000&lt;br /&gt;
; &#039;&#039;ecran&#039;&#039;&lt;br /&gt;
:Datele nu corespund restricțiilor impuse.&lt;br /&gt;
; &#039;&#039;cate.out&#039;&#039;&lt;br /&gt;
:&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Rezolvare == &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
# 4092 - cate&lt;br /&gt;
import sys&lt;br /&gt;
import math&lt;br /&gt;
&lt;br /&gt;
def valideaza_datele(cerinta, numar_teste, teste):&lt;br /&gt;
    if cerinta not in [1, 2]:&lt;br /&gt;
        return &amp;quot;Datele nu corespund restricțiilor impuse.&amp;quot;&lt;br /&gt;
    if numar_teste != len(teste):&lt;br /&gt;
        return &amp;quot;Datele nu corespund restricțiilor impuse.&amp;quot;&lt;br /&gt;
    for test in teste:&lt;br /&gt;
        a, b = test&lt;br /&gt;
        if a &amp;lt; 1 or a &amp;gt; 1000000 or b &amp;lt; 1 or b &amp;gt; 1000000:&lt;br /&gt;
            return &amp;quot;Datele nu corespund restricțiilor impuse.&amp;quot;&lt;br /&gt;
    return &amp;quot;Datele sunt introduse corect.&amp;quot;&lt;br /&gt;
&lt;br /&gt;
def rezolva_cerinta_1(teste):&lt;br /&gt;
    rezultate = []&lt;br /&gt;
    for test in teste:&lt;br /&gt;
        a, b = sorted(test)&lt;br /&gt;
        if a &amp;gt; b:&lt;br /&gt;
            rezultate.append(0)&lt;br /&gt;
        else:&lt;br /&gt;
            rezultate.append(int(math.sqrt(b)) - int(math.sqrt(a - 1)))&lt;br /&gt;
    return rezultate&lt;br /&gt;
&lt;br /&gt;
def rezolva_cerinta_2(teste):&lt;br /&gt;
    numere_prime = [True] * 1000001&lt;br /&gt;
    numere_prime[0] = numere_prime[1] = False&lt;br /&gt;
    prefix_suma = [0] * 1000001&lt;br /&gt;
    for i in range(2, 1001):&lt;br /&gt;
        if numere_prime[i]:&lt;br /&gt;
            prefix_suma[i * i] = 1&lt;br /&gt;
            for j in range(i * i, 1000001, i):&lt;br /&gt;
                numere_prime[j] = False&lt;br /&gt;
    for i in range(1, 1000001):&lt;br /&gt;
        prefix_suma[i] += prefix_suma[i - 1]&lt;br /&gt;
&lt;br /&gt;
    rezultate = []&lt;br /&gt;
    for test in teste:&lt;br /&gt;
        a, b = sorted(test)&lt;br /&gt;
        rezultate.append(prefix_suma[b] - prefix_suma[a - 1])&lt;br /&gt;
    return rezultate&lt;br /&gt;
&lt;br /&gt;
if __name__ == &#039;__main__&#039;:&lt;br /&gt;
    with open(&amp;quot;cate.in&amp;quot;, &amp;quot;r&amp;quot;) as fisier_intrare:&lt;br /&gt;
        cerinta, numar_teste = map(int, fisier_intrare.readline().split())&lt;br /&gt;
        teste = []&lt;br /&gt;
        for _ in range(numar_teste):&lt;br /&gt;
            a, b = map(int, fisier_intrare.readline().split())&lt;br /&gt;
            teste.append((a, b))&lt;br /&gt;
&lt;br /&gt;
    rezultat_validare = valideaza_datele(cerinta, numar_teste, teste)&lt;br /&gt;
    if rezultat_validare != &amp;quot;Datele sunt introduse corect.&amp;quot;:&lt;br /&gt;
        print(rezultat_validare)&lt;br /&gt;
    else:&lt;br /&gt;
        if cerinta == 1:&lt;br /&gt;
            rezultate = rezolva_cerinta_1(teste)&lt;br /&gt;
        else:&lt;br /&gt;
            rezultate = rezolva_cerinta_2(teste)&lt;br /&gt;
&lt;br /&gt;
        with open(&amp;quot;cate.out&amp;quot;, &amp;quot;w&amp;quot;) as fisier_iesire:&lt;br /&gt;
            for rezultat in rezultate:&lt;br /&gt;
                fisier_iesire.write(str(rezultat) + &amp;quot;\n&amp;quot;)&lt;br /&gt;
        print(&amp;quot;Datele sunt introduse corect.&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Explicatie==&lt;br /&gt;
&lt;br /&gt;
valideaza_datele(cerinta, numar_teste, teste): Această funcție primește ca parametri cerința de rezolvat (cerinta), numărul de teste (numar_teste) și o listă de teste (teste). Ea verifică dacă datele introduse sunt valide conform cerințelor impuse. Mai întâi verifică dacă cerința este 1 sau 2 și apoi verifică dacă numărul de teste coincide cu numărul de teste introduse în listă. În cele din urmă, se verifică dacă valorile a și b din fiecare test sunt în intervalul [1, 1000000]. Dacă datele sunt introduse corect, funcția returnează un mesaj de confirmare, altfel returnează un mesaj de eroare.&lt;br /&gt;
&lt;br /&gt;
rezolva_cerinta_1(teste): Această funcție primește ca parametru o listă de teste (teste) pentru cerința 1. Pentru fiecare test din listă, funcția sortează valorile a și b și calculează diferența dintre rădăcina pătrată a lui b și rădăcina pătrată a lui a-1. În cele din urmă, rezultatele sunt stocate într-o listă și returnate.&lt;br /&gt;
&lt;br /&gt;
rezolva_cerinta_2(teste): Această funcție primește ca parametru o listă de teste (teste) pentru cerința 2. Funcția calculează, pentru fiecare număr între 2 și 1000000, dacă este prim sau nu. Această informație este stocată într-o listă de booleni numită numere_prime, în care valoarea True indică faptul că numărul este prim, iar valoarea False indică faptul că numărul nu este prim. De asemenea, funcția calculează un prefix-sum pentru această listă. Acest prefix-sum se numește prefix_suma și este folosit pentru a calcula rapid câte numere prime sunt într-un interval dat. Mai întâi, pentru fiecare pătrat al unui număr prim, se pune o valoare de 1 în prefix_suma, indicând faptul că acel număr prim se află în intervalul [pătratul lui i, 1000000]. Apoi, pentru fiecare număr între 1 și 1000000, se adaugă valoarea precedentă din prefix_suma la valoarea curentă, astfel încât prefix_suma devine un prefix-sum pentru numărul de numere prime din intervalul [1, i]. Pentru fiecare test din listă, funcția sortează valorile a și b și calculează diferența dintre prefix-suma lui b și prefix-suma lui a-1. În cele din urmă, rezultatele sunt stocate într-o lista&lt;br /&gt;
&lt;br /&gt;
Funcția main este funcția principală a programului, care coordonează executarea acestuia. Ea verifică dacă programul este rulat ca script, sau este importat ca modul, prin intermediul instrucțiunii if __name__ == &#039;__main__&#039;:.&lt;br /&gt;
&lt;br /&gt;
Dacă programul este rulat ca script, atunci această instrucțiune va fi adevărată, iar codul din interiorul acesteia va fi executat. În acest caz, se deschide fișierul de intrare &amp;quot;cate.in&amp;quot; pentru citire, se citește prima linie pentru a obține cerința (cerinta) și numărul de teste (numar_teste), iar apoi se citește fiecare test și se stochează în lista teste. Aceste valori sunt folosite pentru a apela funcția valideaza_datele(cerinta, numar_teste, teste), care verifică dacă datele introduse sunt valide conform cerințelor impuse. Dacă datele sunt valide, atunci se apelează funcția corespunzătoare pentru a rezolva problema, fie rezolva_cerinta_1(teste) sau rezolva_cerinta_2(teste), în funcție de cerință. Rezultatele sunt stocate în lista rezultate, care este scrisă în fișierul de ieșire &amp;quot;cate.out&amp;quot;, iar apoi se afișează un mesaj de confirmare a introducerii corecte a datelor.&lt;br /&gt;
&lt;br /&gt;
Dacă programul este importat ca modul, atunci instrucțiunea if __name__ == &#039;__main__&#039;: este falsă, iar codul din interiorul acesteia nu va fi executat. În acest caz, funcția main poate fi apelată din alt modul, pentru a rezolva problema cu datele date în parametrii funcției.&lt;/div&gt;</summary>
		<author><name>Sovago Rares-Andrei</name></author>
	</entry>
	<entry>
		<id>https://wiki.universitas.ro/index.php?title=4092_-_cate&amp;diff=5502</id>
		<title>4092 - cate</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=4092_-_cate&amp;diff=5502"/>
		<updated>2023-04-29T16:27:57Z</updated>

		<summary type="html">&lt;p&gt;Sovago Rares-Andrei: /* Cerința */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Cerința==&lt;br /&gt;
&lt;br /&gt;
Se dă &#039;&#039;&#039;&amp;quot;n&amp;quot;&#039;&#039;&#039;, un număr natural și &#039;&#039;&#039;&amp;quot;n&amp;quot;&#039;&#039;&#039; perechi de numere &#039;&#039;&#039;(&amp;quot;a&amp;quot;, &amp;quot;b&amp;quot;)&#039;&#039;&#039;. Să se determine:&lt;br /&gt;
&lt;br /&gt;
Câte numere din intervalul închis determinat de &#039;&#039;&#039;&amp;quot;a&amp;quot;&#039;&#039;&#039; și &#039;&#039;&#039;&amp;quot;b&amp;quot;&#039;&#039;&#039; au număr impar de divizori pozitivi.&lt;br /&gt;
Câte numere cu exact trei divizori pozitivi se găsesc în intervalul închis determinat de &#039;&#039;&#039;&amp;quot;a&amp;quot;&#039;&#039;&#039; și &#039;&#039;&#039;&amp;quot;b&amp;quot;&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
==Date de intrare==&lt;br /&gt;
&lt;br /&gt;
Fișierul de intrare &amp;quot;cate.in&amp;quot; conține pe prima linie două numere naturale &amp;quot;C&amp;quot; și &amp;quot;n&amp;quot;, separate printr-un spațiu. &amp;quot;C&amp;quot; reprezintă cerința care trebuie rezolvată (1 sau 2), iar &amp;quot;n&amp;quot; reprezintă numărul de perechi. Pe următoarele &amp;quot;n&amp;quot; linii se găsesc cele &amp;quot;n&amp;quot; perechi de numere naturale, separate prin câte un spațiu.&lt;br /&gt;
&lt;br /&gt;
==Date de ieșire==&lt;br /&gt;
&lt;br /&gt;
Dacă datele sunt introduse corect, pe ecran se va afișa: &amp;quot;Datele sunt introduse corect.&amp;quot;. Fișierul de ieșire &amp;quot;cate.out&amp;quot; va conține &amp;quot;n&amp;quot; linii. Pe linia &amp;quot;i&amp;quot; trebuie să se găsească răspunsul la întrebarea corespunzătoare de pe linia &amp;quot;i+1&amp;quot; a fișierului de intrare. În cazul în care datele nu respectă restricțiile, se va afișa: &amp;quot;Datele nu corespund restricțiilor impuse.&amp;quot;.&lt;br /&gt;
== Restricţii şi precizări ==&lt;br /&gt;
*1 ≤ n ≤ 100.000&lt;br /&gt;
*1 ≤ a, b ≤ 1.000.000&lt;br /&gt;
*Pentru 42 de puncte, C = 1&lt;br /&gt;
*Pentru 58 de puncte, C = 2&lt;br /&gt;
== Exemple ==&lt;br /&gt;
===Exemplul 1===&lt;br /&gt;
; &#039;&#039;cate.in&#039;&#039;&lt;br /&gt;
:2 3&lt;br /&gt;
:1 10&lt;br /&gt;
:30 10&lt;br /&gt;
:100 500&lt;br /&gt;
; &#039;&#039;ecran&#039;&#039;&lt;br /&gt;
:Datele sunt introduse corect.&lt;br /&gt;
; &#039;&#039;cate.out&#039;&#039;&lt;br /&gt;
:2&lt;br /&gt;
:1&lt;br /&gt;
:4&lt;br /&gt;
&lt;br /&gt;
===Exemplul 2===&lt;br /&gt;
===Exemplul 1===&lt;br /&gt;
; &#039;&#039;cate.in&#039;&#039;&lt;br /&gt;
:1 3&lt;br /&gt;
:1 10&lt;br /&gt;
:30 10&lt;br /&gt;
:100 500&lt;br /&gt;
; &#039;&#039;ecran&#039;&#039;&lt;br /&gt;
:Datele sunt introduse corect.&lt;br /&gt;
; &#039;&#039;cate.out&#039;&#039;&lt;br /&gt;
:3&lt;br /&gt;
:2&lt;br /&gt;
:13&lt;br /&gt;
===Exemplul 3===&lt;br /&gt;
; &#039;&#039;cate.in&#039;&#039;&lt;br /&gt;
:1 3&lt;br /&gt;
:1 10&lt;br /&gt;
:30 10&lt;br /&gt;
:100 500000000&lt;br /&gt;
; &#039;&#039;ecran&#039;&#039;&lt;br /&gt;
:Datele nu corespund restricțiilor impuse.&lt;br /&gt;
; &#039;&#039;cate.out&#039;&#039;&lt;br /&gt;
:&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Rezolvare == &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
# 4092 - cate&lt;br /&gt;
import sys&lt;br /&gt;
import math&lt;br /&gt;
&lt;br /&gt;
def valideaza_datele(cerinta, numar_teste, teste):&lt;br /&gt;
    if cerinta not in [1, 2]:&lt;br /&gt;
        return &amp;quot;Datele nu corespund restricțiilor impuse.&amp;quot;&lt;br /&gt;
    if numar_teste != len(teste):&lt;br /&gt;
        return &amp;quot;Datele nu corespund restricțiilor impuse.&amp;quot;&lt;br /&gt;
    for test in teste:&lt;br /&gt;
        a, b = test&lt;br /&gt;
        if a &amp;lt; 1 or a &amp;gt; 1000000 or b &amp;lt; 1 or b &amp;gt; 1000000:&lt;br /&gt;
            return &amp;quot;Datele nu corespund restricțiilor impuse.&amp;quot;&lt;br /&gt;
    return &amp;quot;Datele sunt introduse corect.&amp;quot;&lt;br /&gt;
&lt;br /&gt;
def rezolva_cerinta_1(teste):&lt;br /&gt;
    rezultate = []&lt;br /&gt;
    for test in teste:&lt;br /&gt;
        a, b = sorted(test)&lt;br /&gt;
        if a &amp;gt; b:&lt;br /&gt;
            rezultate.append(0)&lt;br /&gt;
        else:&lt;br /&gt;
            rezultate.append(int(math.sqrt(b)) - int(math.sqrt(a - 1)))&lt;br /&gt;
    return rezultate&lt;br /&gt;
&lt;br /&gt;
def rezolva_cerinta_2(teste):&lt;br /&gt;
    numere_prime = [True] * 1000001&lt;br /&gt;
    numere_prime[0] = numere_prime[1] = False&lt;br /&gt;
    prefix_suma = [0] * 1000001&lt;br /&gt;
    for i in range(2, 1001):&lt;br /&gt;
        if numere_prime[i]:&lt;br /&gt;
            prefix_suma[i * i] = 1&lt;br /&gt;
            for j in range(i * i, 1000001, i):&lt;br /&gt;
                numere_prime[j] = False&lt;br /&gt;
    for i in range(1, 1000001):&lt;br /&gt;
        prefix_suma[i] += prefix_suma[i - 1]&lt;br /&gt;
&lt;br /&gt;
    rezultate = []&lt;br /&gt;
    for test in teste:&lt;br /&gt;
        a, b = sorted(test)&lt;br /&gt;
        rezultate.append(prefix_suma[b] - prefix_suma[a - 1])&lt;br /&gt;
    return rezultate&lt;br /&gt;
&lt;br /&gt;
if __name__ == &#039;__main__&#039;:&lt;br /&gt;
    with open(&amp;quot;cate.in&amp;quot;, &amp;quot;r&amp;quot;) as fisier_intrare:&lt;br /&gt;
        cerinta, numar_teste = map(int, fisier_intrare.readline().split())&lt;br /&gt;
        teste = []&lt;br /&gt;
        for _ in range(numar_teste):&lt;br /&gt;
            a, b = map(int, fisier_intrare.readline().split())&lt;br /&gt;
            teste.append((a, b))&lt;br /&gt;
&lt;br /&gt;
    rezultat_validare = valideaza_datele(cerinta, numar_teste, teste)&lt;br /&gt;
    if rezultat_validare != &amp;quot;Datele sunt introduse corect.&amp;quot;:&lt;br /&gt;
        print(rezultat_validare)&lt;br /&gt;
    else:&lt;br /&gt;
        if cerinta == 1:&lt;br /&gt;
            rezultate = rezolva_cerinta_1(teste)&lt;br /&gt;
        else:&lt;br /&gt;
            rezultate = rezolva_cerinta_2(teste)&lt;br /&gt;
&lt;br /&gt;
        with open(&amp;quot;cate.out&amp;quot;, &amp;quot;w&amp;quot;) as fisier_iesire:&lt;br /&gt;
            for rezultat in rezultate:&lt;br /&gt;
                fisier_iesire.write(str(rezultat) + &amp;quot;\n&amp;quot;)&lt;br /&gt;
        print(&amp;quot;Datele sunt introduse corect.&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Explicatie==&lt;br /&gt;
&lt;br /&gt;
valideaza_datele(cerinta, numar_teste, teste): Această funcție primește ca parametri cerința de rezolvat (cerinta), numărul de teste (numar_teste) și o listă de teste (teste). Ea verifică dacă datele introduse sunt valide conform cerințelor impuse. Mai întâi verifică dacă cerința este 1 sau 2 și apoi verifică dacă numărul de teste coincide cu numărul de teste introduse în listă. În cele din urmă, se verifică dacă valorile a și b din fiecare test sunt în intervalul [1, 1000000]. Dacă datele sunt introduse corect, funcția returnează un mesaj de confirmare, altfel returnează un mesaj de eroare.&lt;br /&gt;
&lt;br /&gt;
rezolva_cerinta_1(teste): Această funcție primește ca parametru o listă de teste (teste) pentru cerința 1. Pentru fiecare test din listă, funcția sortează valorile a și b și calculează diferența dintre rădăcina pătrată a lui b și rădăcina pătrată a lui a-1. În cele din urmă, rezultatele sunt stocate într-o listă și returnate.&lt;br /&gt;
&lt;br /&gt;
rezolva_cerinta_2(teste): Această funcție primește ca parametru o listă de teste (teste) pentru cerința 2. Funcția calculează, pentru fiecare număr între 2 și 1000000, dacă este prim sau nu. Această informație este stocată într-o listă de booleni numită numere_prime, în care valoarea True indică faptul că numărul este prim, iar valoarea False indică faptul că numărul nu este prim. De asemenea, funcția calculează un prefix-sum pentru această listă. Acest prefix-sum se numește prefix_suma și este folosit pentru a calcula rapid câte numere prime sunt într-un interval dat. Mai întâi, pentru fiecare pătrat al unui număr prim, se pune o valoare de 1 în prefix_suma, indicând faptul că acel număr prim se află în intervalul [pătratul lui i, 1000000]. Apoi, pentru fiecare număr între 1 și 1000000, se adaugă valoarea precedentă din prefix_suma la valoarea curentă, astfel încât prefix_suma devine un prefix-sum pentru numărul de numere prime din intervalul [1, i]. Pentru fiecare test din listă, funcția sortează valorile a și b și calculează diferența dintre prefix-suma lui b și prefix-suma lui a-1. În cele din urmă, rezultatele sunt stocate într-o lista&lt;br /&gt;
&lt;br /&gt;
Funcția main este funcția principală a programului, care coordonează executarea acestuia. Ea verifică dacă programul este rulat ca script, sau este importat ca modul, prin intermediul instrucțiunii if __name__ == &#039;__main__&#039;:.&lt;br /&gt;
&lt;br /&gt;
Dacă programul este rulat ca script, atunci această instrucțiune va fi adevărată, iar codul din interiorul acesteia va fi executat. În acest caz, se deschide fișierul de intrare &amp;quot;cate.in&amp;quot; pentru citire, se citește prima linie pentru a obține cerința (cerinta) și numărul de teste (numar_teste), iar apoi se citește fiecare test și se stochează în lista teste. Aceste valori sunt folosite pentru a apela funcția valideaza_datele(cerinta, numar_teste, teste), care verifică dacă datele introduse sunt valide conform cerințelor impuse. Dacă datele sunt valide, atunci se apelează funcția corespunzătoare pentru a rezolva problema, fie rezolva_cerinta_1(teste) sau rezolva_cerinta_2(teste), în funcție de cerință. Rezultatele sunt stocate în lista rezultate, care este scrisă în fișierul de ieșire &amp;quot;cate.out&amp;quot;, iar apoi se afișează un mesaj de confirmare a introducerii corecte a datelor.&lt;br /&gt;
&lt;br /&gt;
Dacă programul este importat ca modul, atunci instrucțiunea if __name__ == &#039;__main__&#039;: este falsă, iar codul din interiorul acesteia nu va fi executat. În acest caz, funcția main poate fi apelată din alt modul, pentru a rezolva problema cu datele date în parametrii funcției.&lt;/div&gt;</summary>
		<author><name>Sovago Rares-Andrei</name></author>
	</entry>
	<entry>
		<id>https://wiki.universitas.ro/index.php?title=3763_-_Puternic&amp;diff=5501</id>
		<title>3763 - Puternic</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=3763_-_Puternic&amp;diff=5501"/>
		<updated>2023-04-29T16:25:15Z</updated>

		<summary type="html">&lt;p&gt;Sovago Rares-Andrei: /* Date de ieșire */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Cerința==&lt;br /&gt;
&lt;br /&gt;
Un număr puternic este un număr natural mai mare decât 1 care are proprietatea că dacă este divizibil cu numărul prim &#039;&#039;&#039;p&#039;&#039;&#039; atunci este divizibil și cu &#039;&#039;&#039;p^2&#039;&#039;&#039;. De exemplu, 36 și 27 sunt numere puternice, în timp ce 12 nu este număr puternic deoarece este divizibil cu 3 și nu este divizibil cu &#039;&#039;&#039;3^2&#039;&#039;&#039;. La ora de matematică elevii au aflat ce înseamnă un număr puternic. Pentru a verifica dacă elevii au înțeles, domnul profesor a scris pe tablă un șir de &#039;&#039;&#039;N&#039;&#039;&#039; numere naturale &#039;&#039;&#039;X1, X2, …, XN&#039;&#039;&#039; și l-a rugat pe Mihai să șteargă din șir numerele puternice.&lt;br /&gt;
&lt;br /&gt;
Analizând numerele rămase, Mihai a observat că se poate obține un număr puternic prin concatenarea a două numere din șirul rămas, numere egal depărtate de capetele acestui nou șir. Concatenarea presupune lipirea numărului din a doua jumătate a șirului la finalul celui aflat în prima jumătate. Dacă noul șir are număr impar de elemente, elementul din mijloc se ignoră. De exemplu, dacă șirul obținut după ștergerea numerelor puternice este: 12, 1, 19, 13, 3, 21, 5 atunci numerele obținute prin concatenare sunt 125, 121, 193.&lt;br /&gt;
Scrieți un program care citește un număr natural N și apoi un șir de N numere naturale și determină:&lt;br /&gt;
&lt;br /&gt;
Câte numere puternice sunt în șirul dat;&lt;br /&gt;
Care sunt perechile de numere din șirul rămas după ștergerea numerelor puternice, numere egal departate de capetele șirului, prin concatenarea cărora se obține un număr puternic.&lt;br /&gt;
&lt;br /&gt;
== Date de intrare ==&lt;br /&gt;
&lt;br /&gt;
Fișierul de intrare &#039;&#039;&#039;puternic.in&#039;&#039;&#039; conține pe prima linie un număr natural &#039;&#039;&#039;C&#039;&#039;&#039;. Pentru toate testele de intrare, numărul &#039;&#039;&#039;C&#039;&#039;&#039; poate avea doar valoarea 1 sau 2. Pe a doua linie a fișierului se găsește numărul natural &#039;&#039;&#039;N&#039;&#039;&#039;. Pe a treia linie se găsesc &#039;&#039;&#039;N&#039;&#039;&#039; numere naturale separate prin câte un spațiu.&lt;br /&gt;
&lt;br /&gt;
== Date de ieșire ==&lt;br /&gt;
&lt;br /&gt;
Dacă datele sunt introduse corect, pe ecran se va afișa: &amp;quot;Datele sunt introduse corect.&amp;quot; Dacă &#039;&#039;&#039;C = 1&#039;&#039;&#039;, se va rezolva cerința 1. În acest caz, fișierul de ieșire &#039;&#039;&#039;puternic.out&#039;&#039;&#039; va conține pe prima linie un număr natural reprezentând numărul de numere puternice din șirul dat.&lt;br /&gt;
&lt;br /&gt;
Dacă &#039;&#039;&#039;C = 2&#039;&#039;&#039;, se va rezolva cerința 2 În acest caz, fișierul de ieșire puternic.out va conține perechile de numere egal depărtate de capetele șirului obținut după ștergere, prin concatenarea cărora de obține un număr puternic. Fiecare pereche se scrie pe câte un rând, iar numerele din pereche se scriu separate printr-un spațiu, primul număr fiind cel din stânga. Dacă sunt mai multe astfel de perechi se vor afișa, în ordine, începând cu cea apropiată de capetele noului șir. Dacă nu există nicio astfel de pereche, în fișierul &#039;&#039;&#039;puternic.out&#039;&#039;&#039; se va afișa &#039;&#039;&#039;-1&#039;&#039;&#039;. În cazul în care datele nu respectă restricțiile, se va afișa: &amp;quot;Datele nu corespund restricțiilor impuse.&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
== Restricţii şi precizări ==&lt;br /&gt;
*1 ≤ N ≤ 100.000&lt;br /&gt;
*1 ≤ X1, X2, …, XN ≤ 1.000.000.000&lt;br /&gt;
== Exemple ==&lt;br /&gt;
===Exemplul 1===&lt;br /&gt;
; &#039;&#039;puternic.in&#039;&#039;&lt;br /&gt;
:2&lt;br /&gt;
:11&lt;br /&gt;
:12 9 1 8 19 6 3 4 49 21 5&lt;br /&gt;
; &#039;&#039;ecran&#039;&#039;&lt;br /&gt;
:Datele sunt introduse corect.&lt;br /&gt;
; &#039;&#039;puternic.out&#039;&#039;&lt;br /&gt;
:12 5&lt;br /&gt;
:1 21&lt;br /&gt;
&lt;br /&gt;
===Exemplul 2===&lt;br /&gt;
; &#039;&#039;puternic.in&#039;&#039;&lt;br /&gt;
:1&lt;br /&gt;
:8&lt;br /&gt;
:100 28 16 11 484 25 162 27&lt;br /&gt;
; &#039;&#039;ecran&#039;&#039;&lt;br /&gt;
:Datele sunt introduse corect.&lt;br /&gt;
; &#039;&#039;puternic.out&#039;&#039;&lt;br /&gt;
:5&lt;br /&gt;
===Exemplul 3===&lt;br /&gt;
; &#039;&#039;puternic.in&#039;&#039;&lt;br /&gt;
:2&lt;br /&gt;
:5&lt;br /&gt;
:1 2 3 4 5 6&lt;br /&gt;
; &#039;&#039;ecran&#039;&#039;&lt;br /&gt;
:Datele nu corespund restricțiilor impuse.&lt;br /&gt;
; &#039;&#039;puternic.out&#039;&#039;&lt;br /&gt;
:&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Rezolvare == &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
# 3763 - Puternic&lt;br /&gt;
import math&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
# Funcția de validare a datelor de intrare&lt;br /&gt;
def valideaza_intrare(C: int, N: int, nums: list[int]) -&amp;gt; bool:&lt;br /&gt;
    # Verificăm că C este 1 sau 2&lt;br /&gt;
    if C not in [1, 2]:&lt;br /&gt;
        return False&lt;br /&gt;
&lt;br /&gt;
    # Verificăm că N este între 1 și 100.000&lt;br /&gt;
    if not (1 &amp;lt;= N &amp;lt;= 100000):&lt;br /&gt;
        return False&lt;br /&gt;
&lt;br /&gt;
    # Verificăm că lista nums are lungimea N și conține doar numere întregi între 1 și 1.000.000.000&lt;br /&gt;
    if len(nums) != N or not all(isinstance(x, int) and 1 &amp;lt;= x &amp;lt;= 1000000000 for x in nums):&lt;br /&gt;
        return False&lt;br /&gt;
&lt;br /&gt;
    return True&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
# Funcția de rezolvare&lt;br /&gt;
def rezolva(C: int, N: int, nums: list[int]) -&amp;gt; str:&lt;br /&gt;
    # Cazul 1&lt;br /&gt;
    if C == 1:&lt;br /&gt;
        nrp = 0&lt;br /&gt;
        for x in nums:&lt;br /&gt;
            if x &amp;gt; 1 and este_puternic(x):&lt;br /&gt;
                nrp += 1&lt;br /&gt;
        return str(nrp)&lt;br /&gt;
&lt;br /&gt;
    # Cazul 2&lt;br /&gt;
    nums_noi = []&lt;br /&gt;
    for x in nums:&lt;br /&gt;
        if x == 1 or not este_puternic(x):&lt;br /&gt;
            nums_noi.append(x)&lt;br /&gt;
&lt;br /&gt;
    result = []&lt;br /&gt;
    for i in range(len(nums_noi) // 2):&lt;br /&gt;
        nr1 = nums_noi[i]&lt;br /&gt;
        nr2 = nums_noi[-i - 1]&lt;br /&gt;
        lp = concateneaza(nr1, nr2)&lt;br /&gt;
        if este_puternic(lp):&lt;br /&gt;
            result.append((nr1, nr2))&lt;br /&gt;
&lt;br /&gt;
    if not result:&lt;br /&gt;
        return &amp;quot;-1&amp;quot;&lt;br /&gt;
    else:&lt;br /&gt;
        return &amp;quot;\n&amp;quot;.join([f&amp;quot;{nr1} {nr2}&amp;quot; for nr1, nr2 in result])&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
# Funcția de verificare dacă un număr este puternic&lt;br /&gt;
def este_puternic(nr: int) -&amp;gt; bool:&lt;br /&gt;
    # Calculăm descompunerea în factori primi și verificăm dacă toți au exponența mai mare sau egală cu 2&lt;br /&gt;
    i = 2&lt;br /&gt;
    while i * i &amp;lt;= nr:&lt;br /&gt;
        ex = 0&lt;br /&gt;
        while nr % i == 0:&lt;br /&gt;
            ex += 1&lt;br /&gt;
            nr //= i&lt;br /&gt;
        if ex == 1:&lt;br /&gt;
            return False&lt;br /&gt;
        i += 1&lt;br /&gt;
    if nr &amp;gt; 1:&lt;br /&gt;
        ex = 1&lt;br /&gt;
    if ex == 1:&lt;br /&gt;
        return False&lt;br /&gt;
&lt;br /&gt;
    # Verificăm dacă nr este pătrat perfect sau cub perfect&lt;br /&gt;
    sqrt_nr = round(math.sqrt(nr))&lt;br /&gt;
    if sqrt_nr * sqrt_nr == nr:&lt;br /&gt;
        return True&lt;br /&gt;
    cub_rt = round(nr ** (1 / 3))&lt;br /&gt;
    if cub_rt * cub_rt * cub_rt == nr:&lt;br /&gt;
        return True&lt;br /&gt;
    return False&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
# Funcția de concatenare a două numere întregi&lt;br /&gt;
def concateneaza(a: int, b: int) -&amp;gt; int:&lt;br /&gt;
    s = str(a) + str(b)&lt;br /&gt;
    return int(s)&lt;br /&gt;
&lt;br /&gt;
if __name__ == &amp;quot;__main__&amp;quot;:&lt;br /&gt;
    with open(&amp;quot;puternic.in&amp;quot;, &amp;quot;r&amp;quot;) as fin:&lt;br /&gt;
        with open(&amp;quot;puternic.out&amp;quot;, &amp;quot;w&amp;quot;) as fout:&lt;br /&gt;
            C = int(fin.readline().strip())&lt;br /&gt;
            N = int(fin.readline().strip())&lt;br /&gt;
            nums = list(map(int, fin.readline().strip().split()))&lt;br /&gt;
&lt;br /&gt;
            if not valideaza_intrare(C, N, nums):&lt;br /&gt;
                 print(&amp;quot;Datele nu corespund restricțiilor impuse.&amp;quot;)&lt;br /&gt;
            else:&lt;br /&gt;
                print(&amp;quot;Datele sunt introduse corect.\n&amp;quot;)&lt;br /&gt;
                rezultat = rezolva(C, N, nums)&lt;br /&gt;
                fout.write(rezultat)&lt;br /&gt;
               &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Explicatie==&lt;br /&gt;
&lt;br /&gt;
Funcția valideaza_intrare(C: int, N: int, nums: list[int]) -&amp;gt; bool&lt;br /&gt;
Această funcție primește trei parametri de intrare:&lt;br /&gt;
&lt;br /&gt;
C este un întreg care indică tipul de interogare pe care trebuie să o efectuăm (1 sau 2)&lt;br /&gt;
N este un întreg care indică numărul de numere întregi din lista nums&lt;br /&gt;
nums este o listă de N numere întregi, care sunt subiectul interogării&lt;br /&gt;
Funcția verifică dacă datele de intrare sunt valide și returnează True dacă sunt, altfel returnează False. Pentru a fi considerate valide, datele de intrare trebuie să îndeplinească următoarele condiții:&lt;br /&gt;
&lt;br /&gt;
C trebuie să fie 1 sau 2&lt;br /&gt;
N trebuie să fie între 1 și 100.000&lt;br /&gt;
Lista nums trebuie să conțină exact N elemente și toate elementele trebuie să fie numere întregi între 1 și 1.000.000.000.&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
Funcția rezolva(C: int, N: int, nums: list[int]) -&amp;gt; str&lt;br /&gt;
Această funcție primește aceiași trei parametri ca și funcția valideaza_intrare(). Funcția rezolvă problema specificată în enunț în funcție de tipul de interogare C, folosindu-se de celelalte două funcții (este_puternic() și concateneaza()) și returnează un șir de caractere care reprezintă rezultatul problemei.&lt;br /&gt;
&lt;br /&gt;
Dacă C este 1, funcția numără numerele puternice din lista nums și returnează numărul rezultat. Dacă C este 2, funcția elimină din lista nums toate numerele puternice și numerele cu valoarea 1, apoi formează toate perechile posibile de numere rămase, concatenând fiecare pereche și verificând dacă numărul obținut este puternic. Dacă există cel puțin o astfel de pereche, funcția returnează o listă de perechi de numere care satisfac condiția, altfel returnează valoarea &amp;quot;-1&amp;quot;.&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Funcția este_puternic(nr: int) -&amp;gt; bool&lt;br /&gt;
Această funcție primește un singur parametru, nr, care este un număr întreg. Funcția verifică dacă numărul nr este puternic și returnează True dacă este și False în caz contrar.&lt;br /&gt;
&lt;br /&gt;
Un număr este puternic dacă toți factorii lui primi sunt ridicați la puterea cel puțin 2 sau dacă este pătrat perfect sau cub perfect. Această funcție utilizează metoda descompunerii în factori primi pentru a verifica dacă toți factorii primi ai numărului nr au exponența mai mare sau egală cu 2.&lt;br /&gt;
Funcția concateneaza(a: int, b: int) -&amp;gt; int&lt;br /&gt;
Această funcție primește două numere întregi a și b și le concatenează într-un singur număr. De exemplu, dacă a este 1234 și b este 5678, atunci concateneaza(a, b) va returna numărul 12345678.&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Funcția main()&lt;br /&gt;
Această funcție nu primește niciun parametru, dar conține codul care citește datele de intrare din fișierul puternic.in, validează datele folosind funcția valideaza_intrare(), apoi calculează rezultatul utilizând funcția rezolva().&lt;br /&gt;
&lt;br /&gt;
Dacă datele de intrare sunt invalide, funcția afișează un mesaj corespunzător. În caz contrar, funcția scrie rezultatul în fișierul puternic.out și afișează un mesaj de confirmare.&lt;br /&gt;
&lt;br /&gt;
Este important de menționat că această implementare folosește tipuri de date și anotări de tipuri, care sunt specifice Python-ului. De asemenea, codul este scris într-un stil modular, care face ca fiecare funcție să aibă un singur scop și să fie ușor de înțeles și de testat.&lt;/div&gt;</summary>
		<author><name>Sovago Rares-Andrei</name></author>
	</entry>
	<entry>
		<id>https://wiki.universitas.ro/index.php?title=3763_-_Puternic&amp;diff=5500</id>
		<title>3763 - Puternic</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=3763_-_Puternic&amp;diff=5500"/>
		<updated>2023-04-29T16:24:28Z</updated>

		<summary type="html">&lt;p&gt;Sovago Rares-Andrei: /* Cerința */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Cerința==&lt;br /&gt;
&lt;br /&gt;
Un număr puternic este un număr natural mai mare decât 1 care are proprietatea că dacă este divizibil cu numărul prim &#039;&#039;&#039;p&#039;&#039;&#039; atunci este divizibil și cu &#039;&#039;&#039;p^2&#039;&#039;&#039;. De exemplu, 36 și 27 sunt numere puternice, în timp ce 12 nu este număr puternic deoarece este divizibil cu 3 și nu este divizibil cu &#039;&#039;&#039;3^2&#039;&#039;&#039;. La ora de matematică elevii au aflat ce înseamnă un număr puternic. Pentru a verifica dacă elevii au înțeles, domnul profesor a scris pe tablă un șir de &#039;&#039;&#039;N&#039;&#039;&#039; numere naturale &#039;&#039;&#039;X1, X2, …, XN&#039;&#039;&#039; și l-a rugat pe Mihai să șteargă din șir numerele puternice.&lt;br /&gt;
&lt;br /&gt;
Analizând numerele rămase, Mihai a observat că se poate obține un număr puternic prin concatenarea a două numere din șirul rămas, numere egal depărtate de capetele acestui nou șir. Concatenarea presupune lipirea numărului din a doua jumătate a șirului la finalul celui aflat în prima jumătate. Dacă noul șir are număr impar de elemente, elementul din mijloc se ignoră. De exemplu, dacă șirul obținut după ștergerea numerelor puternice este: 12, 1, 19, 13, 3, 21, 5 atunci numerele obținute prin concatenare sunt 125, 121, 193.&lt;br /&gt;
Scrieți un program care citește un număr natural N și apoi un șir de N numere naturale și determină:&lt;br /&gt;
&lt;br /&gt;
Câte numere puternice sunt în șirul dat;&lt;br /&gt;
Care sunt perechile de numere din șirul rămas după ștergerea numerelor puternice, numere egal departate de capetele șirului, prin concatenarea cărora se obține un număr puternic.&lt;br /&gt;
&lt;br /&gt;
== Date de intrare ==&lt;br /&gt;
&lt;br /&gt;
Fișierul de intrare &#039;&#039;&#039;puternic.in&#039;&#039;&#039; conține pe prima linie un număr natural &#039;&#039;&#039;C&#039;&#039;&#039;. Pentru toate testele de intrare, numărul &#039;&#039;&#039;C&#039;&#039;&#039; poate avea doar valoarea 1 sau 2. Pe a doua linie a fișierului se găsește numărul natural &#039;&#039;&#039;N&#039;&#039;&#039;. Pe a treia linie se găsesc &#039;&#039;&#039;N&#039;&#039;&#039; numere naturale separate prin câte un spațiu.&lt;br /&gt;
&lt;br /&gt;
== Date de ieșire ==&lt;br /&gt;
&lt;br /&gt;
Dacă datele sunt introduse corect, pe ecran se va afișa: &amp;quot;Datele sunt introduse corect.&amp;quot; Dacă &#039;&#039;&#039;C = 1&#039;&#039;&#039;, se va rezolva cerința 1. În acest caz, fișierul de ieșire &#039;&#039;&#039;puternic.out&#039;&#039;&#039; va conține pe prima linie un număr natural reprezentând numărul de numere puternice din șirul dat.&lt;br /&gt;
&lt;br /&gt;
Dacă &#039;&#039;&#039;C = 2&#039;&#039;&#039;, se va rezolva cerința 2 În acest caz, fișierul de ieșire puternic.out va conține perechile de numere egal depărtate de capetele șirului obținut după ștergere, prin concatenarea cărora de obține un număr puternic. Fiecare pereche se scrie pe câte un rând, iar numerele din pereche se scriu separate printr-un spațiu, primul număr fiind cel din stânga. Dacă sunt mai multe astfel de perechi se vor afișa, în ordine, începând cu cea apropiată de capetele noului șir. Dacă nu există nicio astfel de pereche, în fișierul puternic.out se va afișa -1. În cazul în care datele nu respectă restricțiile, se va afișa: &amp;quot;Datele nu corespund restricțiilor impuse.&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
== Restricţii şi precizări ==&lt;br /&gt;
*1 ≤ N ≤ 100.000&lt;br /&gt;
*1 ≤ X1, X2, …, XN ≤ 1.000.000.000&lt;br /&gt;
== Exemple ==&lt;br /&gt;
===Exemplul 1===&lt;br /&gt;
; &#039;&#039;puternic.in&#039;&#039;&lt;br /&gt;
:2&lt;br /&gt;
:11&lt;br /&gt;
:12 9 1 8 19 6 3 4 49 21 5&lt;br /&gt;
; &#039;&#039;ecran&#039;&#039;&lt;br /&gt;
:Datele sunt introduse corect.&lt;br /&gt;
; &#039;&#039;puternic.out&#039;&#039;&lt;br /&gt;
:12 5&lt;br /&gt;
:1 21&lt;br /&gt;
&lt;br /&gt;
===Exemplul 2===&lt;br /&gt;
; &#039;&#039;puternic.in&#039;&#039;&lt;br /&gt;
:1&lt;br /&gt;
:8&lt;br /&gt;
:100 28 16 11 484 25 162 27&lt;br /&gt;
; &#039;&#039;ecran&#039;&#039;&lt;br /&gt;
:Datele sunt introduse corect.&lt;br /&gt;
; &#039;&#039;puternic.out&#039;&#039;&lt;br /&gt;
:5&lt;br /&gt;
===Exemplul 3===&lt;br /&gt;
; &#039;&#039;puternic.in&#039;&#039;&lt;br /&gt;
:2&lt;br /&gt;
:5&lt;br /&gt;
:1 2 3 4 5 6&lt;br /&gt;
; &#039;&#039;ecran&#039;&#039;&lt;br /&gt;
:Datele nu corespund restricțiilor impuse.&lt;br /&gt;
; &#039;&#039;puternic.out&#039;&#039;&lt;br /&gt;
:&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Rezolvare == &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
# 3763 - Puternic&lt;br /&gt;
import math&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
# Funcția de validare a datelor de intrare&lt;br /&gt;
def valideaza_intrare(C: int, N: int, nums: list[int]) -&amp;gt; bool:&lt;br /&gt;
    # Verificăm că C este 1 sau 2&lt;br /&gt;
    if C not in [1, 2]:&lt;br /&gt;
        return False&lt;br /&gt;
&lt;br /&gt;
    # Verificăm că N este între 1 și 100.000&lt;br /&gt;
    if not (1 &amp;lt;= N &amp;lt;= 100000):&lt;br /&gt;
        return False&lt;br /&gt;
&lt;br /&gt;
    # Verificăm că lista nums are lungimea N și conține doar numere întregi între 1 și 1.000.000.000&lt;br /&gt;
    if len(nums) != N or not all(isinstance(x, int) and 1 &amp;lt;= x &amp;lt;= 1000000000 for x in nums):&lt;br /&gt;
        return False&lt;br /&gt;
&lt;br /&gt;
    return True&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
# Funcția de rezolvare&lt;br /&gt;
def rezolva(C: int, N: int, nums: list[int]) -&amp;gt; str:&lt;br /&gt;
    # Cazul 1&lt;br /&gt;
    if C == 1:&lt;br /&gt;
        nrp = 0&lt;br /&gt;
        for x in nums:&lt;br /&gt;
            if x &amp;gt; 1 and este_puternic(x):&lt;br /&gt;
                nrp += 1&lt;br /&gt;
        return str(nrp)&lt;br /&gt;
&lt;br /&gt;
    # Cazul 2&lt;br /&gt;
    nums_noi = []&lt;br /&gt;
    for x in nums:&lt;br /&gt;
        if x == 1 or not este_puternic(x):&lt;br /&gt;
            nums_noi.append(x)&lt;br /&gt;
&lt;br /&gt;
    result = []&lt;br /&gt;
    for i in range(len(nums_noi) // 2):&lt;br /&gt;
        nr1 = nums_noi[i]&lt;br /&gt;
        nr2 = nums_noi[-i - 1]&lt;br /&gt;
        lp = concateneaza(nr1, nr2)&lt;br /&gt;
        if este_puternic(lp):&lt;br /&gt;
            result.append((nr1, nr2))&lt;br /&gt;
&lt;br /&gt;
    if not result:&lt;br /&gt;
        return &amp;quot;-1&amp;quot;&lt;br /&gt;
    else:&lt;br /&gt;
        return &amp;quot;\n&amp;quot;.join([f&amp;quot;{nr1} {nr2}&amp;quot; for nr1, nr2 in result])&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
# Funcția de verificare dacă un număr este puternic&lt;br /&gt;
def este_puternic(nr: int) -&amp;gt; bool:&lt;br /&gt;
    # Calculăm descompunerea în factori primi și verificăm dacă toți au exponența mai mare sau egală cu 2&lt;br /&gt;
    i = 2&lt;br /&gt;
    while i * i &amp;lt;= nr:&lt;br /&gt;
        ex = 0&lt;br /&gt;
        while nr % i == 0:&lt;br /&gt;
            ex += 1&lt;br /&gt;
            nr //= i&lt;br /&gt;
        if ex == 1:&lt;br /&gt;
            return False&lt;br /&gt;
        i += 1&lt;br /&gt;
    if nr &amp;gt; 1:&lt;br /&gt;
        ex = 1&lt;br /&gt;
    if ex == 1:&lt;br /&gt;
        return False&lt;br /&gt;
&lt;br /&gt;
    # Verificăm dacă nr este pătrat perfect sau cub perfect&lt;br /&gt;
    sqrt_nr = round(math.sqrt(nr))&lt;br /&gt;
    if sqrt_nr * sqrt_nr == nr:&lt;br /&gt;
        return True&lt;br /&gt;
    cub_rt = round(nr ** (1 / 3))&lt;br /&gt;
    if cub_rt * cub_rt * cub_rt == nr:&lt;br /&gt;
        return True&lt;br /&gt;
    return False&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
# Funcția de concatenare a două numere întregi&lt;br /&gt;
def concateneaza(a: int, b: int) -&amp;gt; int:&lt;br /&gt;
    s = str(a) + str(b)&lt;br /&gt;
    return int(s)&lt;br /&gt;
&lt;br /&gt;
if __name__ == &amp;quot;__main__&amp;quot;:&lt;br /&gt;
    with open(&amp;quot;puternic.in&amp;quot;, &amp;quot;r&amp;quot;) as fin:&lt;br /&gt;
        with open(&amp;quot;puternic.out&amp;quot;, &amp;quot;w&amp;quot;) as fout:&lt;br /&gt;
            C = int(fin.readline().strip())&lt;br /&gt;
            N = int(fin.readline().strip())&lt;br /&gt;
            nums = list(map(int, fin.readline().strip().split()))&lt;br /&gt;
&lt;br /&gt;
            if not valideaza_intrare(C, N, nums):&lt;br /&gt;
                 print(&amp;quot;Datele nu corespund restricțiilor impuse.&amp;quot;)&lt;br /&gt;
            else:&lt;br /&gt;
                print(&amp;quot;Datele sunt introduse corect.\n&amp;quot;)&lt;br /&gt;
                rezultat = rezolva(C, N, nums)&lt;br /&gt;
                fout.write(rezultat)&lt;br /&gt;
               &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Explicatie==&lt;br /&gt;
&lt;br /&gt;
Funcția valideaza_intrare(C: int, N: int, nums: list[int]) -&amp;gt; bool&lt;br /&gt;
Această funcție primește trei parametri de intrare:&lt;br /&gt;
&lt;br /&gt;
C este un întreg care indică tipul de interogare pe care trebuie să o efectuăm (1 sau 2)&lt;br /&gt;
N este un întreg care indică numărul de numere întregi din lista nums&lt;br /&gt;
nums este o listă de N numere întregi, care sunt subiectul interogării&lt;br /&gt;
Funcția verifică dacă datele de intrare sunt valide și returnează True dacă sunt, altfel returnează False. Pentru a fi considerate valide, datele de intrare trebuie să îndeplinească următoarele condiții:&lt;br /&gt;
&lt;br /&gt;
C trebuie să fie 1 sau 2&lt;br /&gt;
N trebuie să fie între 1 și 100.000&lt;br /&gt;
Lista nums trebuie să conțină exact N elemente și toate elementele trebuie să fie numere întregi între 1 și 1.000.000.000.&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
Funcția rezolva(C: int, N: int, nums: list[int]) -&amp;gt; str&lt;br /&gt;
Această funcție primește aceiași trei parametri ca și funcția valideaza_intrare(). Funcția rezolvă problema specificată în enunț în funcție de tipul de interogare C, folosindu-se de celelalte două funcții (este_puternic() și concateneaza()) și returnează un șir de caractere care reprezintă rezultatul problemei.&lt;br /&gt;
&lt;br /&gt;
Dacă C este 1, funcția numără numerele puternice din lista nums și returnează numărul rezultat. Dacă C este 2, funcția elimină din lista nums toate numerele puternice și numerele cu valoarea 1, apoi formează toate perechile posibile de numere rămase, concatenând fiecare pereche și verificând dacă numărul obținut este puternic. Dacă există cel puțin o astfel de pereche, funcția returnează o listă de perechi de numere care satisfac condiția, altfel returnează valoarea &amp;quot;-1&amp;quot;.&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Funcția este_puternic(nr: int) -&amp;gt; bool&lt;br /&gt;
Această funcție primește un singur parametru, nr, care este un număr întreg. Funcția verifică dacă numărul nr este puternic și returnează True dacă este și False în caz contrar.&lt;br /&gt;
&lt;br /&gt;
Un număr este puternic dacă toți factorii lui primi sunt ridicați la puterea cel puțin 2 sau dacă este pătrat perfect sau cub perfect. Această funcție utilizează metoda descompunerii în factori primi pentru a verifica dacă toți factorii primi ai numărului nr au exponența mai mare sau egală cu 2.&lt;br /&gt;
Funcția concateneaza(a: int, b: int) -&amp;gt; int&lt;br /&gt;
Această funcție primește două numere întregi a și b și le concatenează într-un singur număr. De exemplu, dacă a este 1234 și b este 5678, atunci concateneaza(a, b) va returna numărul 12345678.&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Funcția main()&lt;br /&gt;
Această funcție nu primește niciun parametru, dar conține codul care citește datele de intrare din fișierul puternic.in, validează datele folosind funcția valideaza_intrare(), apoi calculează rezultatul utilizând funcția rezolva().&lt;br /&gt;
&lt;br /&gt;
Dacă datele de intrare sunt invalide, funcția afișează un mesaj corespunzător. În caz contrar, funcția scrie rezultatul în fișierul puternic.out și afișează un mesaj de confirmare.&lt;br /&gt;
&lt;br /&gt;
Este important de menționat că această implementare folosește tipuri de date și anotări de tipuri, care sunt specifice Python-ului. De asemenea, codul este scris într-un stil modular, care face ca fiecare funcție să aibă un singur scop și să fie ușor de înțeles și de testat.&lt;/div&gt;</summary>
		<author><name>Sovago Rares-Andrei</name></author>
	</entry>
	<entry>
		<id>https://wiki.universitas.ro/index.php?title=3763_-_Puternic&amp;diff=5499</id>
		<title>3763 - Puternic</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=3763_-_Puternic&amp;diff=5499"/>
		<updated>2023-04-29T16:24:09Z</updated>

		<summary type="html">&lt;p&gt;Sovago Rares-Andrei: /* Cerința */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Cerința==&lt;br /&gt;
&lt;br /&gt;
Un număr puternic este un număr natural mai mare decât 1 care are proprietatea că dacă este divizibil cu numărul prim p atunci este divizibil și cu &#039;&#039;&#039;p^2&#039;&#039;&#039;. De exemplu, 36 și 27 sunt numere puternice, în timp ce 12 nu este număr puternic deoarece este divizibil cu 3 și nu este divizibil cu &#039;&#039;&#039;3^2&#039;&#039;&#039;. La ora de matematică elevii au aflat ce înseamnă un număr puternic. Pentru a verifica dacă elevii au înțeles, domnul profesor a scris pe tablă un șir de &#039;&#039;&#039;N&#039;&#039;&#039; numere naturale &#039;&#039;&#039;X1, X2, …, XN&#039;&#039;&#039; și l-a rugat pe Mihai să șteargă din șir numerele puternice.&lt;br /&gt;
&lt;br /&gt;
Analizând numerele rămase, Mihai a observat că se poate obține un număr puternic prin concatenarea a două numere din șirul rămas, numere egal depărtate de capetele acestui nou șir. Concatenarea presupune lipirea numărului din a doua jumătate a șirului la finalul celui aflat în prima jumătate. Dacă noul șir are număr impar de elemente, elementul din mijloc se ignoră. De exemplu, dacă șirul obținut după ștergerea numerelor puternice este: 12, 1, 19, 13, 3, 21, 5 atunci numerele obținute prin concatenare sunt 125, 121, 193.&lt;br /&gt;
Scrieți un program care citește un număr natural N și apoi un șir de N numere naturale și determină:&lt;br /&gt;
&lt;br /&gt;
Câte numere puternice sunt în șirul dat;&lt;br /&gt;
Care sunt perechile de numere din șirul rămas după ștergerea numerelor puternice, numere egal departate de capetele șirului, prin concatenarea cărora se obține un număr puternic.&lt;br /&gt;
&lt;br /&gt;
== Date de intrare ==&lt;br /&gt;
&lt;br /&gt;
Fișierul de intrare &#039;&#039;&#039;puternic.in&#039;&#039;&#039; conține pe prima linie un număr natural &#039;&#039;&#039;C&#039;&#039;&#039;. Pentru toate testele de intrare, numărul &#039;&#039;&#039;C&#039;&#039;&#039; poate avea doar valoarea 1 sau 2. Pe a doua linie a fișierului se găsește numărul natural &#039;&#039;&#039;N&#039;&#039;&#039;. Pe a treia linie se găsesc &#039;&#039;&#039;N&#039;&#039;&#039; numere naturale separate prin câte un spațiu.&lt;br /&gt;
&lt;br /&gt;
== Date de ieșire ==&lt;br /&gt;
&lt;br /&gt;
Dacă datele sunt introduse corect, pe ecran se va afișa: &amp;quot;Datele sunt introduse corect.&amp;quot; Dacă &#039;&#039;&#039;C = 1&#039;&#039;&#039;, se va rezolva cerința 1. În acest caz, fișierul de ieșire &#039;&#039;&#039;puternic.out&#039;&#039;&#039; va conține pe prima linie un număr natural reprezentând numărul de numere puternice din șirul dat.&lt;br /&gt;
&lt;br /&gt;
Dacă &#039;&#039;&#039;C = 2&#039;&#039;&#039;, se va rezolva cerința 2 În acest caz, fișierul de ieșire puternic.out va conține perechile de numere egal depărtate de capetele șirului obținut după ștergere, prin concatenarea cărora de obține un număr puternic. Fiecare pereche se scrie pe câte un rând, iar numerele din pereche se scriu separate printr-un spațiu, primul număr fiind cel din stânga. Dacă sunt mai multe astfel de perechi se vor afișa, în ordine, începând cu cea apropiată de capetele noului șir. Dacă nu există nicio astfel de pereche, în fișierul puternic.out se va afișa -1. În cazul în care datele nu respectă restricțiile, se va afișa: &amp;quot;Datele nu corespund restricțiilor impuse.&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
== Restricţii şi precizări ==&lt;br /&gt;
*1 ≤ N ≤ 100.000&lt;br /&gt;
*1 ≤ X1, X2, …, XN ≤ 1.000.000.000&lt;br /&gt;
== Exemple ==&lt;br /&gt;
===Exemplul 1===&lt;br /&gt;
; &#039;&#039;puternic.in&#039;&#039;&lt;br /&gt;
:2&lt;br /&gt;
:11&lt;br /&gt;
:12 9 1 8 19 6 3 4 49 21 5&lt;br /&gt;
; &#039;&#039;ecran&#039;&#039;&lt;br /&gt;
:Datele sunt introduse corect.&lt;br /&gt;
; &#039;&#039;puternic.out&#039;&#039;&lt;br /&gt;
:12 5&lt;br /&gt;
:1 21&lt;br /&gt;
&lt;br /&gt;
===Exemplul 2===&lt;br /&gt;
; &#039;&#039;puternic.in&#039;&#039;&lt;br /&gt;
:1&lt;br /&gt;
:8&lt;br /&gt;
:100 28 16 11 484 25 162 27&lt;br /&gt;
; &#039;&#039;ecran&#039;&#039;&lt;br /&gt;
:Datele sunt introduse corect.&lt;br /&gt;
; &#039;&#039;puternic.out&#039;&#039;&lt;br /&gt;
:5&lt;br /&gt;
===Exemplul 3===&lt;br /&gt;
; &#039;&#039;puternic.in&#039;&#039;&lt;br /&gt;
:2&lt;br /&gt;
:5&lt;br /&gt;
:1 2 3 4 5 6&lt;br /&gt;
; &#039;&#039;ecran&#039;&#039;&lt;br /&gt;
:Datele nu corespund restricțiilor impuse.&lt;br /&gt;
; &#039;&#039;puternic.out&#039;&#039;&lt;br /&gt;
:&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Rezolvare == &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
# 3763 - Puternic&lt;br /&gt;
import math&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
# Funcția de validare a datelor de intrare&lt;br /&gt;
def valideaza_intrare(C: int, N: int, nums: list[int]) -&amp;gt; bool:&lt;br /&gt;
    # Verificăm că C este 1 sau 2&lt;br /&gt;
    if C not in [1, 2]:&lt;br /&gt;
        return False&lt;br /&gt;
&lt;br /&gt;
    # Verificăm că N este între 1 și 100.000&lt;br /&gt;
    if not (1 &amp;lt;= N &amp;lt;= 100000):&lt;br /&gt;
        return False&lt;br /&gt;
&lt;br /&gt;
    # Verificăm că lista nums are lungimea N și conține doar numere întregi între 1 și 1.000.000.000&lt;br /&gt;
    if len(nums) != N or not all(isinstance(x, int) and 1 &amp;lt;= x &amp;lt;= 1000000000 for x in nums):&lt;br /&gt;
        return False&lt;br /&gt;
&lt;br /&gt;
    return True&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
# Funcția de rezolvare&lt;br /&gt;
def rezolva(C: int, N: int, nums: list[int]) -&amp;gt; str:&lt;br /&gt;
    # Cazul 1&lt;br /&gt;
    if C == 1:&lt;br /&gt;
        nrp = 0&lt;br /&gt;
        for x in nums:&lt;br /&gt;
            if x &amp;gt; 1 and este_puternic(x):&lt;br /&gt;
                nrp += 1&lt;br /&gt;
        return str(nrp)&lt;br /&gt;
&lt;br /&gt;
    # Cazul 2&lt;br /&gt;
    nums_noi = []&lt;br /&gt;
    for x in nums:&lt;br /&gt;
        if x == 1 or not este_puternic(x):&lt;br /&gt;
            nums_noi.append(x)&lt;br /&gt;
&lt;br /&gt;
    result = []&lt;br /&gt;
    for i in range(len(nums_noi) // 2):&lt;br /&gt;
        nr1 = nums_noi[i]&lt;br /&gt;
        nr2 = nums_noi[-i - 1]&lt;br /&gt;
        lp = concateneaza(nr1, nr2)&lt;br /&gt;
        if este_puternic(lp):&lt;br /&gt;
            result.append((nr1, nr2))&lt;br /&gt;
&lt;br /&gt;
    if not result:&lt;br /&gt;
        return &amp;quot;-1&amp;quot;&lt;br /&gt;
    else:&lt;br /&gt;
        return &amp;quot;\n&amp;quot;.join([f&amp;quot;{nr1} {nr2}&amp;quot; for nr1, nr2 in result])&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
# Funcția de verificare dacă un număr este puternic&lt;br /&gt;
def este_puternic(nr: int) -&amp;gt; bool:&lt;br /&gt;
    # Calculăm descompunerea în factori primi și verificăm dacă toți au exponența mai mare sau egală cu 2&lt;br /&gt;
    i = 2&lt;br /&gt;
    while i * i &amp;lt;= nr:&lt;br /&gt;
        ex = 0&lt;br /&gt;
        while nr % i == 0:&lt;br /&gt;
            ex += 1&lt;br /&gt;
            nr //= i&lt;br /&gt;
        if ex == 1:&lt;br /&gt;
            return False&lt;br /&gt;
        i += 1&lt;br /&gt;
    if nr &amp;gt; 1:&lt;br /&gt;
        ex = 1&lt;br /&gt;
    if ex == 1:&lt;br /&gt;
        return False&lt;br /&gt;
&lt;br /&gt;
    # Verificăm dacă nr este pătrat perfect sau cub perfect&lt;br /&gt;
    sqrt_nr = round(math.sqrt(nr))&lt;br /&gt;
    if sqrt_nr * sqrt_nr == nr:&lt;br /&gt;
        return True&lt;br /&gt;
    cub_rt = round(nr ** (1 / 3))&lt;br /&gt;
    if cub_rt * cub_rt * cub_rt == nr:&lt;br /&gt;
        return True&lt;br /&gt;
    return False&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
# Funcția de concatenare a două numere întregi&lt;br /&gt;
def concateneaza(a: int, b: int) -&amp;gt; int:&lt;br /&gt;
    s = str(a) + str(b)&lt;br /&gt;
    return int(s)&lt;br /&gt;
&lt;br /&gt;
if __name__ == &amp;quot;__main__&amp;quot;:&lt;br /&gt;
    with open(&amp;quot;puternic.in&amp;quot;, &amp;quot;r&amp;quot;) as fin:&lt;br /&gt;
        with open(&amp;quot;puternic.out&amp;quot;, &amp;quot;w&amp;quot;) as fout:&lt;br /&gt;
            C = int(fin.readline().strip())&lt;br /&gt;
            N = int(fin.readline().strip())&lt;br /&gt;
            nums = list(map(int, fin.readline().strip().split()))&lt;br /&gt;
&lt;br /&gt;
            if not valideaza_intrare(C, N, nums):&lt;br /&gt;
                 print(&amp;quot;Datele nu corespund restricțiilor impuse.&amp;quot;)&lt;br /&gt;
            else:&lt;br /&gt;
                print(&amp;quot;Datele sunt introduse corect.\n&amp;quot;)&lt;br /&gt;
                rezultat = rezolva(C, N, nums)&lt;br /&gt;
                fout.write(rezultat)&lt;br /&gt;
               &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Explicatie==&lt;br /&gt;
&lt;br /&gt;
Funcția valideaza_intrare(C: int, N: int, nums: list[int]) -&amp;gt; bool&lt;br /&gt;
Această funcție primește trei parametri de intrare:&lt;br /&gt;
&lt;br /&gt;
C este un întreg care indică tipul de interogare pe care trebuie să o efectuăm (1 sau 2)&lt;br /&gt;
N este un întreg care indică numărul de numere întregi din lista nums&lt;br /&gt;
nums este o listă de N numere întregi, care sunt subiectul interogării&lt;br /&gt;
Funcția verifică dacă datele de intrare sunt valide și returnează True dacă sunt, altfel returnează False. Pentru a fi considerate valide, datele de intrare trebuie să îndeplinească următoarele condiții:&lt;br /&gt;
&lt;br /&gt;
C trebuie să fie 1 sau 2&lt;br /&gt;
N trebuie să fie între 1 și 100.000&lt;br /&gt;
Lista nums trebuie să conțină exact N elemente și toate elementele trebuie să fie numere întregi între 1 și 1.000.000.000.&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
Funcția rezolva(C: int, N: int, nums: list[int]) -&amp;gt; str&lt;br /&gt;
Această funcție primește aceiași trei parametri ca și funcția valideaza_intrare(). Funcția rezolvă problema specificată în enunț în funcție de tipul de interogare C, folosindu-se de celelalte două funcții (este_puternic() și concateneaza()) și returnează un șir de caractere care reprezintă rezultatul problemei.&lt;br /&gt;
&lt;br /&gt;
Dacă C este 1, funcția numără numerele puternice din lista nums și returnează numărul rezultat. Dacă C este 2, funcția elimină din lista nums toate numerele puternice și numerele cu valoarea 1, apoi formează toate perechile posibile de numere rămase, concatenând fiecare pereche și verificând dacă numărul obținut este puternic. Dacă există cel puțin o astfel de pereche, funcția returnează o listă de perechi de numere care satisfac condiția, altfel returnează valoarea &amp;quot;-1&amp;quot;.&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Funcția este_puternic(nr: int) -&amp;gt; bool&lt;br /&gt;
Această funcție primește un singur parametru, nr, care este un număr întreg. Funcția verifică dacă numărul nr este puternic și returnează True dacă este și False în caz contrar.&lt;br /&gt;
&lt;br /&gt;
Un număr este puternic dacă toți factorii lui primi sunt ridicați la puterea cel puțin 2 sau dacă este pătrat perfect sau cub perfect. Această funcție utilizează metoda descompunerii în factori primi pentru a verifica dacă toți factorii primi ai numărului nr au exponența mai mare sau egală cu 2.&lt;br /&gt;
Funcția concateneaza(a: int, b: int) -&amp;gt; int&lt;br /&gt;
Această funcție primește două numere întregi a și b și le concatenează într-un singur număr. De exemplu, dacă a este 1234 și b este 5678, atunci concateneaza(a, b) va returna numărul 12345678.&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Funcția main()&lt;br /&gt;
Această funcție nu primește niciun parametru, dar conține codul care citește datele de intrare din fișierul puternic.in, validează datele folosind funcția valideaza_intrare(), apoi calculează rezultatul utilizând funcția rezolva().&lt;br /&gt;
&lt;br /&gt;
Dacă datele de intrare sunt invalide, funcția afișează un mesaj corespunzător. În caz contrar, funcția scrie rezultatul în fișierul puternic.out și afișează un mesaj de confirmare.&lt;br /&gt;
&lt;br /&gt;
Este important de menționat că această implementare folosește tipuri de date și anotări de tipuri, care sunt specifice Python-ului. De asemenea, codul este scris într-un stil modular, care face ca fiecare funcție să aibă un singur scop și să fie ușor de înțeles și de testat.&lt;/div&gt;</summary>
		<author><name>Sovago Rares-Andrei</name></author>
	</entry>
	<entry>
		<id>https://wiki.universitas.ro/index.php?title=3733_-_Cosuri&amp;diff=5498</id>
		<title>3733 - Cosuri</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=3733_-_Cosuri&amp;diff=5498"/>
		<updated>2023-04-29T16:22:49Z</updated>

		<summary type="html">&lt;p&gt;Sovago Rares-Andrei: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Cerința==&lt;br /&gt;
&lt;br /&gt;
Se consideră &#039;&#039;&#039;N&#039;&#039;&#039; coșuri numerotate cu numerele distincte de la 1 la &#039;&#039;&#039;2•N&#039;&#039;&#039;.&lt;br /&gt;
Coșul 1 conține &#039;&#039;&#039;C1&#039;&#039;&#039; mere, coșul 2 conține &#039;&#039;&#039;C2&#039;&#039;&#039; mere,…, coșul &#039;&#039;&#039;2•N&#039;&#039;&#039; conține &#039;&#039;&#039;C2•N&#039;&#039;&#039; mere.&lt;br /&gt;
&lt;br /&gt;
Cele &#039;&#039;&#039;2•N&#039;&#039;&#039; coșuri vor fi grupate două câte două, rezultând N perechi de coșuri. Fiecare coș poate face parte dintr-o singură pereche. Numărul de mere dintr-o pereche de coșuri este egal cu suma numerelor de mere din cele două coșuri. Pentru fiecare pereche, valoarea absolută a diferenței numerelor de mere din cele două coșuri ale perechii reprezintă excedentul perechii.&lt;br /&gt;
&lt;br /&gt;
Ionuț, având o fire curioasă, vrea să afle mai multe despre aceste perechi.&lt;br /&gt;
&lt;br /&gt;
Mai întâi vrea să afle numărul minim posibil, respectiv maxim posibil, de mere dintr-o pereche, indiferent de gruparea coșurilor în perechi de câte două.&lt;br /&gt;
&lt;br /&gt;
Apoi, Ionuț vă întreabă dacă este posibil să grupeze cele &#039;&#039;&#039;2•N&#039;&#039;&#039; coșuri în perechi de câte două, astfel încât cele N perechi rezultate să aibă același număr de mere. Dacă este posibil, atunci Ionuț vrea să afle și care este valoarea minimă a excedentelor perechilor din noua grupare.&lt;br /&gt;
&lt;br /&gt;
Voi va trebui să îl ajutați pe Ionuț să afle răspunsurile la întrebările lui.&lt;br /&gt;
Scrieți un program care să citească numărul N și cele &#039;&#039;&#039;2•N&#039;&#039;&#039; numere naturale &#039;&#039;&#039;C1, C2,…, C2•N&#039;&#039;&#039;, iar apoi să determine:&lt;br /&gt;
&lt;br /&gt;
1. Numărul minim de mere și numărul maxim de mere pe care le pot avea perechile de coșuri.&lt;br /&gt;
&lt;br /&gt;
2. Răspunsul &#039;&#039;&#039;DA&#039;&#039;&#039; sau &#039;&#039;&#039;NU&#039;&#039;&#039; la întrebarea lui Ionuț; dacă răspunsul este DA, se va determina și care este valoarea minimă a excedentelor perechilor din noua grupare.&lt;br /&gt;
== Date de intrare ==&lt;br /&gt;
&lt;br /&gt;
Fișierul de intrare cosuri.in conține pe prima linie două numere naturale &#039;&#039;&#039;T&#039;&#039;&#039; și &#039;&#039;&#039;N&#039;&#039;&#039; separate printr-un spațiu. A doua linie a fișierului conține cele 2•N numere naturale C1, C2,…, C2•N, separate prin câte un spațiu.&lt;br /&gt;
&lt;br /&gt;
== Date de intrare ==&lt;br /&gt;
&lt;br /&gt;
Fișierul de intrare cosuri.in conține pe prima linie două numere naturale &#039;&#039;&#039;T&#039;&#039;&#039; și &#039;&#039;&#039;N&#039;&#039;&#039; separate printr-un spațiu. A doua linie a fișierului conține cele &#039;&#039;&#039;2•N&#039;&#039;&#039; numere naturale &#039;&#039;&#039;C1&#039;&#039;&#039;, &#039;&#039;&#039;C2&#039;&#039;&#039;,…, &#039;&#039;&#039;C2•N&#039;&#039;&#039;, separate prin câte un spațiu.&lt;br /&gt;
&lt;br /&gt;
== Date de ieșire ==&lt;br /&gt;
&lt;br /&gt;
Dacă datele sunt introduse corect, pe ecran se va afișa: &amp;quot;Datele sunt introduse corect.&amp;quot; Fișierul de ieșire cosuri.out va conține:&lt;br /&gt;
&lt;br /&gt;
Dacă &#039;&#039;&#039;T=1&#039;&#039;&#039;, pe prima linie, două numere naturale separate printr-un singur spațiu reprezentând numărul minim, respectiv maxim de mere pe care le pot avea perechile (răspunsul la cerinţa 1);&lt;br /&gt;
Dacă &#039;&#039;&#039;T=2&#039;&#039;&#039;, pe prima linie, un șir de două caractere care poate fi &#039;&#039;&#039;DA&#039;&#039;&#039; sau &#039;&#039;&#039;NU&#039;&#039;&#039;, reprezentând răspunsul la întrebarea lui Ionuț; dacă răspunsul este DA, atunci a doua linie a fișierului va conține un număr natural reprezentând valoarea minimă a excedentelor perechilor din noua grupare (răspunsul la cerința 2). În cazul în care datele nu respectă restricțiile, se va afișa: &amp;quot;Datele nu corespund restricțiilor impuse.&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
== Restricţii şi precizări ==&lt;br /&gt;
*1 ≤ &#039;&#039;&#039;N&#039;&#039;&#039; ≤ 500 000&lt;br /&gt;
*1 ≤ &#039;&#039;&#039;Ci&#039;&#039;&#039; ≤ 1 000 000, pentru oricare 1 ≤ i ≤ &#039;&#039;&#039;2·N&#039;&#039;&#039;&lt;br /&gt;
*Pentru teste în valoare de 30 de puncte, &#039;&#039;&#039;T = 1&#039;&#039;&#039;&lt;br /&gt;
*Pentru restul de 70 de puncte, &#039;&#039;&#039;T= 2&#039;&#039;&#039;&lt;br /&gt;
*Pentru teste în valoare de 20 de puncte, &#039;&#039;&#039;N ≤ 5&#039;&#039;&#039;&lt;br /&gt;
*Pentru alte teste în valoare de 40 de puncte, &#039;&#039;&#039;N ≤ 70000&#039;&#039;&#039;&lt;br /&gt;
== Exemple ==&lt;br /&gt;
===Exemplul 1===&lt;br /&gt;
; &#039;&#039;cosuri.in&#039;&#039;&lt;br /&gt;
:1 3&lt;br /&gt;
:1 7 4 10 2 9&lt;br /&gt;
; &#039;&#039;ecran&#039;&#039;&lt;br /&gt;
:Datele sunt introduse corect.&lt;br /&gt;
; &#039;&#039;cosuri.out&#039;&#039;&lt;br /&gt;
:3 19&lt;br /&gt;
&lt;br /&gt;
===Exemplul 2===&lt;br /&gt;
; &#039;&#039;cosuri.in&#039;&#039;&lt;br /&gt;
:2 3&lt;br /&gt;
:1 7 4 10 2 9&lt;br /&gt;
; &#039;&#039;ecran&#039;&#039;&lt;br /&gt;
:Datele sunt introduse corect.&lt;br /&gt;
; &#039;&#039;cosuri.out&#039;&#039;&lt;br /&gt;
:DA&lt;br /&gt;
:3&lt;br /&gt;
===Exemplul 3===&lt;br /&gt;
; &#039;&#039;puternic.in&#039;&#039;&lt;br /&gt;
:2 3&lt;br /&gt;
:1 7 5 12 2 9&lt;br /&gt;
; &#039;&#039;ecran&#039;&#039;&lt;br /&gt;
:Datele nu corespund restricțiilor impuse.&lt;br /&gt;
; &#039;&#039;puternic.out&#039;&#039;&lt;br /&gt;
:&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Rezolvare == &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
# 3733 - Cosuri&lt;br /&gt;
import math&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
# Funcția de validare a datelor de intrare&lt;br /&gt;
# Funcția de validare a datelor de intrare&lt;br /&gt;
def validate_input(C: int, N: int, nums: list[int]) -&amp;gt; bool:&lt;br /&gt;
    # Verificăm că C este 1 sau 2&lt;br /&gt;
    if C not in [1, 2]:&lt;br /&gt;
        return False&lt;br /&gt;
&lt;br /&gt;
    # Verificăm că N este între 1 și 100.000&lt;br /&gt;
    if not (1 &amp;lt;= N &amp;lt;= 100000):&lt;br /&gt;
        return False&lt;br /&gt;
&lt;br /&gt;
    # Verificăm că lista nums are lungimea N și conține doar numere întregi între 1 și 1.000.000.000&lt;br /&gt;
    if len(nums) != N or not all(isinstance(x, int) and 1 &amp;lt;= x &amp;lt;= 1000000000 for x in nums):&lt;br /&gt;
        return False&lt;br /&gt;
&lt;br /&gt;
    return True&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
# Funcția de rezolvare&lt;br /&gt;
def solve(C: int, N: int, nums: list[int]) -&amp;gt; str:&lt;br /&gt;
    # Cazul 1&lt;br /&gt;
    if C == 1:&lt;br /&gt;
        nrp = 0&lt;br /&gt;
        for x in nums:&lt;br /&gt;
            if x &amp;gt; 1 and is_powerful(x):&lt;br /&gt;
                nrp += 1&lt;br /&gt;
        return str(nrp)&lt;br /&gt;
&lt;br /&gt;
    # Cazul 2&lt;br /&gt;
    new_nums = []&lt;br /&gt;
    for x in nums:&lt;br /&gt;
        if x == 1 or not is_powerful(x):&lt;br /&gt;
            new_nums.append(x)&lt;br /&gt;
&lt;br /&gt;
    result = []&lt;br /&gt;
    for i in range(len(new_nums) // 2):&lt;br /&gt;
        nr1 = new_nums[i]&lt;br /&gt;
        nr2 = new_nums[-i - 1]&lt;br /&gt;
        lp = concat(nr1, nr2)&lt;br /&gt;
        if is_powerful(lp):&lt;br /&gt;
            result.append((nr1, nr2))&lt;br /&gt;
&lt;br /&gt;
    if not result:&lt;br /&gt;
        return &amp;quot;-1&amp;quot;&lt;br /&gt;
    else:&lt;br /&gt;
        return &amp;quot;\n&amp;quot;.join([f&amp;quot;{nr1} {nr2}&amp;quot; for nr1, nr2 in result])&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
# Funcția de concatenare și verificare dacă numărul obținut este puternic&lt;br /&gt;
def is_powerful(nr: int) -&amp;gt; bool:&lt;br /&gt;
    # Calculăm descompunerea în factori primi și verificăm dacă toți au exponența mai mare sau egală cu 2&lt;br /&gt;
    i = 2&lt;br /&gt;
    while i * i &amp;lt;= nr:&lt;br /&gt;
        ex = 0&lt;br /&gt;
        while nr % i == 0:&lt;br /&gt;
            ex += 1&lt;br /&gt;
            nr //= i&lt;br /&gt;
        if ex == 1:&lt;br /&gt;
            return False&lt;br /&gt;
        i += 1&lt;br /&gt;
    if nr &amp;gt; 1:&lt;br /&gt;
        ex = 1&lt;br /&gt;
    if ex == 1:&lt;br /&gt;
        return False&lt;br /&gt;
&lt;br /&gt;
    # Verificăm dacă nr este pătrat perfect sau cub perfect&lt;br /&gt;
    sqrt_nr = round(math.sqrt(nr))&lt;br /&gt;
    if sqrt_nr * sqrt_nr == nr:&lt;br /&gt;
        return True&lt;br /&gt;
    cub_rt = round(nr ** (1 / 3))&lt;br /&gt;
    if cub_rt * cub_rt * cub_rt == nr:&lt;br /&gt;
        return True&lt;br /&gt;
    return False&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
# Funcția de concatenare a două numere întregi&lt;br /&gt;
def concat(a: int, b: int) -&amp;gt; int:&lt;br /&gt;
    s = str(a) + str(b)&lt;br /&gt;
    return int(s)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
# Funcția main care citește și afișează datele din fișiere&lt;br /&gt;
# Funcția main care citește și afișează datele din fișiere&lt;br /&gt;
if __name__ == &amp;quot;__main__&amp;quot;:&lt;br /&gt;
    with open(&amp;quot;puternic.in&amp;quot;, &amp;quot;r&amp;quot;) as fin:&lt;br /&gt;
        with open(&amp;quot;puternic.out&amp;quot;, &amp;quot;w&amp;quot;) as fout:&lt;br /&gt;
            C = int(fin.readline().strip())&lt;br /&gt;
            N = int(fin.readline().strip())&lt;br /&gt;
            nums = list(map(int, fin.readline().strip().split()))&lt;br /&gt;
&lt;br /&gt;
            if not validate_input(C, N, nums):&lt;br /&gt;
                 print (&amp;quot;Datele nu corespund restricțiilor impuse.&amp;quot;)&lt;br /&gt;
            else:&lt;br /&gt;
                print (&amp;quot;Datele sunt introduse corect.\n&amp;quot;)&lt;br /&gt;
                if C == 1:&lt;br /&gt;
                    nrp = 0&lt;br /&gt;
                    for x in nums:&lt;br /&gt;
                        if x &amp;gt; 1 and is_powerful(x):&lt;br /&gt;
                            nrp += 1&lt;br /&gt;
                    fout.write(str(nrp))&lt;br /&gt;
                elif C == 2:&lt;br /&gt;
                    new_nums = []&lt;br /&gt;
                    for x in nums:&lt;br /&gt;
                        if x == 1 or not is_powerful(x):&lt;br /&gt;
                            new_nums.append(x)&lt;br /&gt;
&lt;br /&gt;
                    result = []&lt;br /&gt;
                    for i in range(len(new_nums) // 2):&lt;br /&gt;
                        nr1 = new_nums[i]&lt;br /&gt;
                        nr2 = new_nums[-i - 1]&lt;br /&gt;
                        lp = concat(nr1, nr2)&lt;br /&gt;
                        if is_powerful(lp):&lt;br /&gt;
                            result.append((nr1, nr2))&lt;br /&gt;
&lt;br /&gt;
                    if not result:&lt;br /&gt;
                        fout.write(&amp;quot;-1&amp;quot;)&lt;br /&gt;
                    else:&lt;br /&gt;
                        fout.write(&amp;quot;\n&amp;quot;.join([f&amp;quot;{nr1} {nr2}&amp;quot; for nr1, nr2 in result]))&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Explicatie==&lt;/div&gt;</summary>
		<author><name>Sovago Rares-Andrei</name></author>
	</entry>
	<entry>
		<id>https://wiki.universitas.ro/index.php?title=3718_-_Tort2&amp;diff=5497</id>
		<title>3718 - Tort2</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=3718_-_Tort2&amp;diff=5497"/>
		<updated>2023-04-29T16:21:09Z</updated>

		<summary type="html">&lt;p&gt;Sovago Rares-Andrei: /* Date de intrare */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Cerința==&lt;br /&gt;
&lt;br /&gt;
Alexandra, prințesa Regatului Visurilor a primit un tort și vrea să-l împartă cu prietenii ei. Astfel ea va organiza o petrecere unde îi va invita. Tortul Alexandrei este format din N bucăți, iar a i-a bucată are ai cireșe. Alexandra va împărți tortul în mai multe secvențe continue de bucăți, astfel încât fiecare bucată este inclusă în exact o secvență, și fiecare secvență conține cel puțin o bucată de tort. Prima secvență – cea care conține prima bucată – o va mânca în noaptea de dinaintea petrecerii, iar restul bucăților le va da celorlalți prieteni invitați. Pentru a nu-i supăra, Alexandra vrea ca fiecare secvență dată unui prieten să conțină la fel de multe cireșe ca oricare altă secvență dată unui prieten (dar nu neapărat la fel de multe cireșe ca aceea mâncată de ea înaintea petrecerii). Alexandra trebuie să invite cel puțin un prieten la petrecere.&lt;br /&gt;
Dându-se N și șirul a, să se afle numărul de moduri în care Alexandra ar putea să împartă tortul în secvențe continue astfel încât să se respecte condițiile din enunț. Două moduri de a împărți tortul se consideră a fi distincte dacă și numai dacă există în unul o secvență care nu există în celălalt (dacă am reprezenta un mod de împărțire în secvențe prin intermediul șirului crescător al indicilor de început pentru fiecare secvență din acea împărțire, două moduri de împărțire sunt distincte dacă șirurile de indici asociate lor sunt diferite).&lt;br /&gt;
&lt;br /&gt;
Formal, dându-se un șir de numere, se vrea să aflăm numărul de moduri de a împărți șirul în cel puțin două subsecvențe, astfel încât sumele elementelor tuturor subsecvențelor să fie egale, prima putând să aibă suma elementelor diferită de a celorlalte.&lt;br /&gt;
== Date de intrare ==&lt;br /&gt;
&lt;br /&gt;
Prima linie a fișierului de intrare tort.in conține numărul &#039;&#039;&#039;N&#039;&#039;&#039;. A doua linie conține valorile &#039;&#039;&#039;a1, …, aN&#039;&#039;&#039;, separate prin spații.&lt;br /&gt;
&lt;br /&gt;
== Date de intrare ==&lt;br /&gt;
&lt;br /&gt;
Fișierul de intrare cosuri.in conține pe prima linie două numere naturale &#039;&#039;&#039;T&#039;&#039;&#039; și &#039;&#039;&#039;N&#039;&#039;&#039; separate printr-un spațiu. A doua linie a fișierului conține cele &#039;&#039;&#039;2•N&#039;&#039;&#039; numere naturale &#039;&#039;&#039;C1&#039;&#039;&#039;, &#039;&#039;&#039;C2&#039;&#039;&#039;,…, &#039;&#039;&#039;C2•N&#039;&#039;&#039;, separate prin câte un spațiu.&lt;br /&gt;
&lt;br /&gt;
== Date de ieșire ==&lt;br /&gt;
&lt;br /&gt;
Dacă datele sunt introduse corect, pe ecran se va afișa: &amp;quot;Datele sunt introduse corect.&amp;quot; Singura linie a fișierului de ieșire tort.out va conține numărul cerut. În cazul în care datele nu respectă restricțiile, se va afișa: &amp;quot;Datele nu corespund restricțiilor impuse.&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
== Restricţii şi precizări ==&lt;br /&gt;
*1 ≤ N ≤ 200.000&lt;br /&gt;
*1 ≤ ai ≤ 400.000&lt;br /&gt;
*a1 + ... + aN ≤ 400.000&lt;br /&gt;
*Pentru 12 puncte, N ≤ 12&lt;br /&gt;
*Pentru alte 12 puncte, 1 ≤ N ≤ 100 și a1 = ... = aN = 1&lt;br /&gt;
*Pentru alte 20 puncte, 1 ≤ N ≤ 100&lt;br /&gt;
*Pentru alte 28 puncte, 1 ≤ N ≤ 1000 și a1 + ... + aN ≤ 2000&lt;br /&gt;
*Pentru alte 28 puncte, fără alte restricții&lt;br /&gt;
== Exemple ==&lt;br /&gt;
===Exemplul 1===&lt;br /&gt;
; &#039;&#039;tort.in&#039;&#039;&lt;br /&gt;
:5&lt;br /&gt;
:1 1 2 1 1&lt;br /&gt;
; &#039;&#039;ecran&#039;&#039;&lt;br /&gt;
:Datele sunt introduse corect.&lt;br /&gt;
; &#039;&#039;tort.out&#039;&#039;&lt;br /&gt;
:1&lt;br /&gt;
&lt;br /&gt;
===Exemplul 2===&lt;br /&gt;
; &#039;&#039;tort.in&#039;&#039;&lt;br /&gt;
:7&lt;br /&gt;
:3 1 4 1 5 9 2&lt;br /&gt;
; &#039;&#039;ecran&#039;&#039;&lt;br /&gt;
:Datele sunt introduse corect.&lt;br /&gt;
; &#039;&#039;tort.out&#039;&#039;&lt;br /&gt;
:4&lt;br /&gt;
===Exemplul 3===&lt;br /&gt;
; &#039;&#039;tort.in&#039;&#039;&lt;br /&gt;
:1&lt;br /&gt;
:1000000&lt;br /&gt;
; &#039;&#039;ecran&#039;&#039;&lt;br /&gt;
:Datele nu corespund restricțiilor impuse.&lt;br /&gt;
; &#039;&#039;tort.out&#039;&#039;&lt;br /&gt;
:&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Rezolvare == &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
# 3718 - Tort2&lt;br /&gt;
import sys&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def validare_input(n, secventa):&lt;br /&gt;
    if n &amp;lt; 2 or n &amp;gt; 200000:&lt;br /&gt;
        return False&lt;br /&gt;
    for numar in secventa:&lt;br /&gt;
        if numar &amp;lt; 1 or numar &amp;gt; 400000:&lt;br /&gt;
            return False&lt;br /&gt;
    return True&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def poate_imparti_secventa(secventa, n, suma_dorita, index, bucata_curenta, prieteni):&lt;br /&gt;
    if prieteni == 1:&lt;br /&gt;
        return False&lt;br /&gt;
&lt;br /&gt;
    if bucata_curenta == suma_dorita:&lt;br /&gt;
        if prieteni == 2:&lt;br /&gt;
            return True&lt;br /&gt;
        return poate_imparti_secventa(secventa, n, suma_dorita, 0, 0, prieteni - 1)&lt;br /&gt;
&lt;br /&gt;
    for i in range(index, n):&lt;br /&gt;
        if secventa[i] + bucata_curenta &amp;lt;= suma_dorita:&lt;br /&gt;
            if poate_imparti_secventa(secventa, n, suma_dorita, i + 1, secventa[i] + bucata_curenta, prieteni):&lt;br /&gt;
                return True&lt;br /&gt;
&lt;br /&gt;
    return False&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def rezolvare(n, secventa):&lt;br /&gt;
    suma_totala = sum(secventa)&lt;br /&gt;
&lt;br /&gt;
    for i in range(2, n + 2):&lt;br /&gt;
        if suma_totala % i != 0:&lt;br /&gt;
            continue&lt;br /&gt;
&lt;br /&gt;
        suma_dorita = suma_totala // i&lt;br /&gt;
        if secventa[0] &amp;gt; suma_dorita:&lt;br /&gt;
            continue&lt;br /&gt;
&lt;br /&gt;
        if poate_imparti_secventa(secventa, n, suma_dorita, 1, secventa[0], i):&lt;br /&gt;
            return i - 1&lt;br /&gt;
&lt;br /&gt;
    return 0&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
if __name__ == &amp;quot;__main__&amp;quot;:&lt;br /&gt;
    with open(&amp;quot;tort.in&amp;quot;, &amp;quot;r&amp;quot;) as fin:&lt;br /&gt;
        dimensiune = int(fin.readline().strip())&lt;br /&gt;
        secventa = list(map(int, fin.readline().split()))&lt;br /&gt;
&lt;br /&gt;
        if not validare_input(dimensiune, secventa):&lt;br /&gt;
            print(&amp;quot;Datele nu corespund restricțiilor impuse.&amp;quot;)&lt;br /&gt;
            sys.exit(0)&lt;br /&gt;
&lt;br /&gt;
        print(&amp;quot;Datele sunt introduse corect.&amp;quot;)&lt;br /&gt;
        with open(&amp;quot;tort.out&amp;quot;, &amp;quot;w&amp;quot;) as fout:&lt;br /&gt;
            ans = rezolvare(dimensiune, secventa)&lt;br /&gt;
            fout.write(str(ans))&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Explicatie==&lt;br /&gt;
&lt;br /&gt;
Funcția validare_input(n, secventa) primește doi parametri: n, care reprezintă numărul de elemente din secvență și secventa, o listă de n numere întregi. Această funcție verifică dacă datele de intrare îndeplinesc condițiile impuse: n trebuie să fie cuprins între 2 și 200000, iar fiecare element din secventa trebuie să fie cuprins între 1 și 400000. Dacă datele de intrare nu îndeplinesc aceste condiții, se afișează un mesaj corespunzător și se iese din program cu ajutorul funcției sys.exit(0). Dacă datele de intrare sunt valide, se calculează și se returnează suma elementelor din secvență.&lt;br /&gt;
&lt;br /&gt;
Funcția poate_imparti_secventa(secventa, n, suma_dorita, index, bucata_curenta, prieteni) primește șase parametri:&lt;br /&gt;
&lt;br /&gt;
secventa: lista de numere întregi care reprezintă secvența de împărțit&lt;br /&gt;
n: numărul de elemente din secvență&lt;br /&gt;
suma_dorita: suma dorită a bucăților, adică suma totală împărțită la numărul de prieteni&lt;br /&gt;
index: indexul elementului curent din secvență&lt;br /&gt;
bucata_curenta: suma curentă a bucății de împărțit&lt;br /&gt;
prieteni: numărul de prieteni rămași&lt;br /&gt;
Această funcție verifică dacă secvența secventa poate fi împărțită în prieteni bucăți astfel încât fiecare bucată să aibă suma suma_dorita. Funcția utilizează o abordare recursivă și verifică toate posibilitățile de împărțire, începând de la indexul index. Dacă secvența poate fi împărțită cu succes, se returnează True, altfel se returnează False.&lt;br /&gt;
&lt;br /&gt;
Funcția rezolvare(n, secventa) primește aceiași doi parametri ca și funcția validare_input(n, secventa). Această funcție calculează suma totală a elementelor din secvență prin apelarea funcției validare_input(n, secventa) și apoi parcurge toate posibilitățile de împărțire a secvenței în bucăți egale. Dacă găsește o împărțire validă, returnează numărul de prieteni implicați în împărțire. Dacă nu există o împărțire validă, se returne&lt;/div&gt;</summary>
		<author><name>Sovago Rares-Andrei</name></author>
	</entry>
	<entry>
		<id>https://wiki.universitas.ro/index.php?title=3718_-_Tort2&amp;diff=5496</id>
		<title>3718 - Tort2</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=3718_-_Tort2&amp;diff=5496"/>
		<updated>2023-04-29T16:20:51Z</updated>

		<summary type="html">&lt;p&gt;Sovago Rares-Andrei: /* Date de intrare */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Cerința==&lt;br /&gt;
&lt;br /&gt;
Alexandra, prințesa Regatului Visurilor a primit un tort și vrea să-l împartă cu prietenii ei. Astfel ea va organiza o petrecere unde îi va invita. Tortul Alexandrei este format din N bucăți, iar a i-a bucată are ai cireșe. Alexandra va împărți tortul în mai multe secvențe continue de bucăți, astfel încât fiecare bucată este inclusă în exact o secvență, și fiecare secvență conține cel puțin o bucată de tort. Prima secvență – cea care conține prima bucată – o va mânca în noaptea de dinaintea petrecerii, iar restul bucăților le va da celorlalți prieteni invitați. Pentru a nu-i supăra, Alexandra vrea ca fiecare secvență dată unui prieten să conțină la fel de multe cireșe ca oricare altă secvență dată unui prieten (dar nu neapărat la fel de multe cireșe ca aceea mâncată de ea înaintea petrecerii). Alexandra trebuie să invite cel puțin un prieten la petrecere.&lt;br /&gt;
Dându-se N și șirul a, să se afle numărul de moduri în care Alexandra ar putea să împartă tortul în secvențe continue astfel încât să se respecte condițiile din enunț. Două moduri de a împărți tortul se consideră a fi distincte dacă și numai dacă există în unul o secvență care nu există în celălalt (dacă am reprezenta un mod de împărțire în secvențe prin intermediul șirului crescător al indicilor de început pentru fiecare secvență din acea împărțire, două moduri de împărțire sunt distincte dacă șirurile de indici asociate lor sunt diferite).&lt;br /&gt;
&lt;br /&gt;
Formal, dându-se un șir de numere, se vrea să aflăm numărul de moduri de a împărți șirul în cel puțin două subsecvențe, astfel încât sumele elementelor tuturor subsecvențelor să fie egale, prima putând să aibă suma elementelor diferită de a celorlalte.&lt;br /&gt;
== Date de intrare ==&lt;br /&gt;
&lt;br /&gt;
Prima linie a fișierului de intrare tort.in conține numărul &#039;&#039;&#039;N&#039;&#039;&#039;. A doua linie conține valorile a1, …, aN, separate prin spații.&lt;br /&gt;
&lt;br /&gt;
== Date de intrare ==&lt;br /&gt;
&lt;br /&gt;
Fișierul de intrare cosuri.in conține pe prima linie două numere naturale &#039;&#039;&#039;T&#039;&#039;&#039; și &#039;&#039;&#039;N&#039;&#039;&#039; separate printr-un spațiu. A doua linie a fișierului conține cele &#039;&#039;&#039;2•N&#039;&#039;&#039; numere naturale &#039;&#039;&#039;C1&#039;&#039;&#039;, &#039;&#039;&#039;C2&#039;&#039;&#039;,…, &#039;&#039;&#039;C2•N&#039;&#039;&#039;, separate prin câte un spațiu.&lt;br /&gt;
&lt;br /&gt;
== Date de ieșire ==&lt;br /&gt;
&lt;br /&gt;
Dacă datele sunt introduse corect, pe ecran se va afișa: &amp;quot;Datele sunt introduse corect.&amp;quot; Singura linie a fișierului de ieșire tort.out va conține numărul cerut. În cazul în care datele nu respectă restricțiile, se va afișa: &amp;quot;Datele nu corespund restricțiilor impuse.&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
== Restricţii şi precizări ==&lt;br /&gt;
*1 ≤ N ≤ 200.000&lt;br /&gt;
*1 ≤ ai ≤ 400.000&lt;br /&gt;
*a1 + ... + aN ≤ 400.000&lt;br /&gt;
*Pentru 12 puncte, N ≤ 12&lt;br /&gt;
*Pentru alte 12 puncte, 1 ≤ N ≤ 100 și a1 = ... = aN = 1&lt;br /&gt;
*Pentru alte 20 puncte, 1 ≤ N ≤ 100&lt;br /&gt;
*Pentru alte 28 puncte, 1 ≤ N ≤ 1000 și a1 + ... + aN ≤ 2000&lt;br /&gt;
*Pentru alte 28 puncte, fără alte restricții&lt;br /&gt;
== Exemple ==&lt;br /&gt;
===Exemplul 1===&lt;br /&gt;
; &#039;&#039;tort.in&#039;&#039;&lt;br /&gt;
:5&lt;br /&gt;
:1 1 2 1 1&lt;br /&gt;
; &#039;&#039;ecran&#039;&#039;&lt;br /&gt;
:Datele sunt introduse corect.&lt;br /&gt;
; &#039;&#039;tort.out&#039;&#039;&lt;br /&gt;
:1&lt;br /&gt;
&lt;br /&gt;
===Exemplul 2===&lt;br /&gt;
; &#039;&#039;tort.in&#039;&#039;&lt;br /&gt;
:7&lt;br /&gt;
:3 1 4 1 5 9 2&lt;br /&gt;
; &#039;&#039;ecran&#039;&#039;&lt;br /&gt;
:Datele sunt introduse corect.&lt;br /&gt;
; &#039;&#039;tort.out&#039;&#039;&lt;br /&gt;
:4&lt;br /&gt;
===Exemplul 3===&lt;br /&gt;
; &#039;&#039;tort.in&#039;&#039;&lt;br /&gt;
:1&lt;br /&gt;
:1000000&lt;br /&gt;
; &#039;&#039;ecran&#039;&#039;&lt;br /&gt;
:Datele nu corespund restricțiilor impuse.&lt;br /&gt;
; &#039;&#039;tort.out&#039;&#039;&lt;br /&gt;
:&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Rezolvare == &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
# 3718 - Tort2&lt;br /&gt;
import sys&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def validare_input(n, secventa):&lt;br /&gt;
    if n &amp;lt; 2 or n &amp;gt; 200000:&lt;br /&gt;
        return False&lt;br /&gt;
    for numar in secventa:&lt;br /&gt;
        if numar &amp;lt; 1 or numar &amp;gt; 400000:&lt;br /&gt;
            return False&lt;br /&gt;
    return True&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def poate_imparti_secventa(secventa, n, suma_dorita, index, bucata_curenta, prieteni):&lt;br /&gt;
    if prieteni == 1:&lt;br /&gt;
        return False&lt;br /&gt;
&lt;br /&gt;
    if bucata_curenta == suma_dorita:&lt;br /&gt;
        if prieteni == 2:&lt;br /&gt;
            return True&lt;br /&gt;
        return poate_imparti_secventa(secventa, n, suma_dorita, 0, 0, prieteni - 1)&lt;br /&gt;
&lt;br /&gt;
    for i in range(index, n):&lt;br /&gt;
        if secventa[i] + bucata_curenta &amp;lt;= suma_dorita:&lt;br /&gt;
            if poate_imparti_secventa(secventa, n, suma_dorita, i + 1, secventa[i] + bucata_curenta, prieteni):&lt;br /&gt;
                return True&lt;br /&gt;
&lt;br /&gt;
    return False&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def rezolvare(n, secventa):&lt;br /&gt;
    suma_totala = sum(secventa)&lt;br /&gt;
&lt;br /&gt;
    for i in range(2, n + 2):&lt;br /&gt;
        if suma_totala % i != 0:&lt;br /&gt;
            continue&lt;br /&gt;
&lt;br /&gt;
        suma_dorita = suma_totala // i&lt;br /&gt;
        if secventa[0] &amp;gt; suma_dorita:&lt;br /&gt;
            continue&lt;br /&gt;
&lt;br /&gt;
        if poate_imparti_secventa(secventa, n, suma_dorita, 1, secventa[0], i):&lt;br /&gt;
            return i - 1&lt;br /&gt;
&lt;br /&gt;
    return 0&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
if __name__ == &amp;quot;__main__&amp;quot;:&lt;br /&gt;
    with open(&amp;quot;tort.in&amp;quot;, &amp;quot;r&amp;quot;) as fin:&lt;br /&gt;
        dimensiune = int(fin.readline().strip())&lt;br /&gt;
        secventa = list(map(int, fin.readline().split()))&lt;br /&gt;
&lt;br /&gt;
        if not validare_input(dimensiune, secventa):&lt;br /&gt;
            print(&amp;quot;Datele nu corespund restricțiilor impuse.&amp;quot;)&lt;br /&gt;
            sys.exit(0)&lt;br /&gt;
&lt;br /&gt;
        print(&amp;quot;Datele sunt introduse corect.&amp;quot;)&lt;br /&gt;
        with open(&amp;quot;tort.out&amp;quot;, &amp;quot;w&amp;quot;) as fout:&lt;br /&gt;
            ans = rezolvare(dimensiune, secventa)&lt;br /&gt;
            fout.write(str(ans))&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Explicatie==&lt;br /&gt;
&lt;br /&gt;
Funcția validare_input(n, secventa) primește doi parametri: n, care reprezintă numărul de elemente din secvență și secventa, o listă de n numere întregi. Această funcție verifică dacă datele de intrare îndeplinesc condițiile impuse: n trebuie să fie cuprins între 2 și 200000, iar fiecare element din secventa trebuie să fie cuprins între 1 și 400000. Dacă datele de intrare nu îndeplinesc aceste condiții, se afișează un mesaj corespunzător și se iese din program cu ajutorul funcției sys.exit(0). Dacă datele de intrare sunt valide, se calculează și se returnează suma elementelor din secvență.&lt;br /&gt;
&lt;br /&gt;
Funcția poate_imparti_secventa(secventa, n, suma_dorita, index, bucata_curenta, prieteni) primește șase parametri:&lt;br /&gt;
&lt;br /&gt;
secventa: lista de numere întregi care reprezintă secvența de împărțit&lt;br /&gt;
n: numărul de elemente din secvență&lt;br /&gt;
suma_dorita: suma dorită a bucăților, adică suma totală împărțită la numărul de prieteni&lt;br /&gt;
index: indexul elementului curent din secvență&lt;br /&gt;
bucata_curenta: suma curentă a bucății de împărțit&lt;br /&gt;
prieteni: numărul de prieteni rămași&lt;br /&gt;
Această funcție verifică dacă secvența secventa poate fi împărțită în prieteni bucăți astfel încât fiecare bucată să aibă suma suma_dorita. Funcția utilizează o abordare recursivă și verifică toate posibilitățile de împărțire, începând de la indexul index. Dacă secvența poate fi împărțită cu succes, se returnează True, altfel se returnează False.&lt;br /&gt;
&lt;br /&gt;
Funcția rezolvare(n, secventa) primește aceiași doi parametri ca și funcția validare_input(n, secventa). Această funcție calculează suma totală a elementelor din secvență prin apelarea funcției validare_input(n, secventa) și apoi parcurge toate posibilitățile de împărțire a secvenței în bucăți egale. Dacă găsește o împărțire validă, returnează numărul de prieteni implicați în împărțire. Dacă nu există o împărțire validă, se returne&lt;/div&gt;</summary>
		<author><name>Sovago Rares-Andrei</name></author>
	</entry>
	<entry>
		<id>https://wiki.universitas.ro/index.php?title=3707_-_forta1&amp;diff=5495</id>
		<title>3707 - forta1</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=3707_-_forta1&amp;diff=5495"/>
		<updated>2023-04-29T16:19:38Z</updated>

		<summary type="html">&lt;p&gt;Sovago Rares-Andrei: /* Cerința */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Cerința==&lt;br /&gt;
&lt;br /&gt;
Definim forța unui element într-un șir ca fiind valoarea obținută considerând numărul de cifre pe care el le are în comun cu fiecare din celelalte elemente ale șirului și însumând aceste valori. De exemplu în șirul (12131, 1243, 15141) elementul 12131 are forța 6, deoarece 12131 are în comun cu 1243 trei cifre (1, 2 și 3) iar cu 15141 are în comun trei cifre (cele 3 cifre 1).&lt;br /&gt;
Se dă un șir cu &#039;&#039;&#039;n&#039;&#039;&#039; elemente numere naturale. Să se sorteze elementele din șir în ordine crescătoare a forței, iar acele elemente care au aceeași forță să apară în ordine inversă decât apăreau inițial în șir.&lt;br /&gt;
&lt;br /&gt;
== Date de intrare ==&lt;br /&gt;
&lt;br /&gt;
Fișierul de intrare &#039;&#039;&#039;forta.in&#039;&#039;&#039; conține pe prima linie n, numărul de elemente din șir, iar pe a doua linie n numere naturale separate prin câte un spațiu, reprezentând elementele șirului.&lt;br /&gt;
&lt;br /&gt;
== Date de ieșire ==&lt;br /&gt;
&lt;br /&gt;
Dacă datele sunt introduse corect, pe ecran se va afișa: &amp;quot;Datele sunt introduse corect.&amp;quot; Fișierul de ieșire &#039;&#039;&#039;forta.out&#039;&#039;&#039; va conține pe prima linie, separate prin câte un spațiu, elementele șirului în ordinea cerută. În cazul în care datele nu respectă restricțiile, se va afișa: &amp;quot;Datele nu corespund restricțiilor impuse.&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
== Restricţii şi precizări ==&lt;br /&gt;
*1 ≤ n ≤ 1000&lt;br /&gt;
*elementele șirului sunt numere naturale mai mici sau egale cu 1018&lt;br /&gt;
*pentru teste în valoare de 30 de puncte elementele șirului vor avea forțe distincte&lt;br /&gt;
== Exemple ==&lt;br /&gt;
===Exemplul 1===&lt;br /&gt;
; &#039;&#039;forta.in&#039;&#039;&lt;br /&gt;
:4&lt;br /&gt;
:123 121 12314 1234&lt;br /&gt;
; &#039;&#039;ecran&#039;&#039;&lt;br /&gt;
:Datele sunt introduse corect.&lt;br /&gt;
; &#039;&#039;forta.out&#039;&#039;&lt;br /&gt;
:121 123 1234 12314&lt;br /&gt;
&lt;br /&gt;
===Exemplul 2===&lt;br /&gt;
; &#039;&#039;forta.in&#039;&#039;&lt;br /&gt;
:5&lt;br /&gt;
:2 3 5 7 11&lt;br /&gt;
; &#039;&#039;ecran&#039;&#039;&lt;br /&gt;
:Datele sunt introduse corect.&lt;br /&gt;
; &#039;&#039;forta.out&#039;&#039;&lt;br /&gt;
:11 7 5 3 2&lt;br /&gt;
===Exemplul 3===&lt;br /&gt;
; &#039;&#039;forta.in&#039;&#039;&lt;br /&gt;
:4&lt;br /&gt;
:-3 2 3 5&lt;br /&gt;
; &#039;&#039;ecran&#039;&#039;&lt;br /&gt;
:Datele nu corespund restricțiilor impuse.&lt;br /&gt;
; &#039;&#039;forta.out&#039;&#039;&lt;br /&gt;
:&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Rezolvare == &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
# 3707 - forta1&lt;br /&gt;
def valideaza_date(numar_elemente, valori, distincte=False):&lt;br /&gt;
    if numar_elemente &amp;lt;= 0 or not all(isinstance(x, int) and x &amp;gt; 0 and x &amp;lt;= 10**18 for x in valori):&lt;br /&gt;
        return False&lt;br /&gt;
    if distincte and len(set(valori)) != numar_elemente:&lt;br /&gt;
        return False&lt;br /&gt;
    return True&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def rezolva_problema(numar_elemente, valori):&lt;br /&gt;
    class Forta:&lt;br /&gt;
        def __init__(self, valoare, frecventa, pozitie):&lt;br /&gt;
            self.valoare = valoare&lt;br /&gt;
            self.frecventa = frecventa&lt;br /&gt;
            self.pozitie = pozitie&lt;br /&gt;
&lt;br /&gt;
    def numara_cifre_comune(numar1, numar2):&lt;br /&gt;
        frecventa1, frecventa2, numar_comun = [0] * 10, [0] * 10, 0&lt;br /&gt;
        while numar1:&lt;br /&gt;
            frecventa1[numar1 % 10] += 1&lt;br /&gt;
            numar1 //= 10&lt;br /&gt;
        while numar2:&lt;br /&gt;
            frecventa2[numar2 % 10] += 1&lt;br /&gt;
            numar2 //= 10&lt;br /&gt;
        for i in range(10):&lt;br /&gt;
            if frecventa1[i] and frecventa2[i]:&lt;br /&gt;
                numar_comun += min(frecventa1[i], frecventa2[i])&lt;br /&gt;
        return numar_comun&lt;br /&gt;
&lt;br /&gt;
    valori_forta = [Forta(valoare=valori[i], frecventa=0, pozitie=i) for i in range(numar_elemente)]&lt;br /&gt;
    for i in range(numar_elemente - 1):&lt;br /&gt;
        for j in range(i + 1, numar_elemente):&lt;br /&gt;
            numar_cifre_comune = numara_cifre_comune(valori_forta[i].valoare, valori_forta[j].valoare)&lt;br /&gt;
            valori_forta[i].frecventa += numar_cifre_comune&lt;br /&gt;
            valori_forta[j].frecventa += numar_cifre_comune&lt;br /&gt;
&lt;br /&gt;
    for i in range(numar_elemente - 1):&lt;br /&gt;
        for j in range(i + 1, numar_elemente):&lt;br /&gt;
            if valori_forta[i].frecventa &amp;gt; valori_forta[j].frecventa:&lt;br /&gt;
                valori_forta[i], valori_forta[j] = valori_forta[j], valori_forta[i]&lt;br /&gt;
            elif valori_forta[i].frecventa == valori_forta[j].frecventa:&lt;br /&gt;
                if valori_forta[i].pozitie &amp;lt; valori_forta[j].pozitie:&lt;br /&gt;
                    valori_forta[i], valori_forta[j] = valori_forta[j], valori_forta[i]&lt;br /&gt;
&lt;br /&gt;
    return [forta.valoare for forta in valori_forta]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
if __name__ == &amp;quot;__main__&amp;quot;:&lt;br /&gt;
    with open(&amp;quot;forta.in&amp;quot;, &amp;quot;r&amp;quot;) as fisier_intrare:&lt;br /&gt;
        numar_elemente = int(fisier_intrare.readline())&lt;br /&gt;
        valori = list(map(int, fisier_intrare.readline().split()))&lt;br /&gt;
&lt;br /&gt;
    if not valideaza_date(numar_elemente, valori, distincte=True):&lt;br /&gt;
        print(&amp;quot;Datele nu corespund restricțiilor impuse.&amp;quot;)&lt;br /&gt;
        exit(0)&lt;br /&gt;
&lt;br /&gt;
    print(&amp;quot;Datele sunt introduse corect.&amp;quot;)&lt;br /&gt;
    rezultat = rezolva_problema(numar_elemente, valori)&lt;br /&gt;
   &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Explicatie==&lt;br /&gt;
&lt;br /&gt;
validare_date(n, v, distincte=False): Această funcție primește două argumente de intrare, numărul n și lista de numere întregi v, și returnează True dacă acestea sunt valide și False altfel. Verificările includ verificarea ca n să fie un număr întreg pozitiv și ca fiecare element din lista v să fie un număr întreg pozitiv mai mic sau egal cu 10^18. Argumentul opțional distincte specifică dacă toate elementele din lista v trebuie să fie distincte sau nu.&lt;br /&gt;
&lt;br /&gt;
rezolvare_problema(n, v): Această funcție primește două argumente de intrare, numărul n și lista de numere întregi v, și rezolvă problema descrisă în enunțul problemei. Funcția construiește o listă de obiecte Forta pentru fiecare element din lista v, fiecare obiect conținând valoarea elementului val, numărul de perechi de cifre comune cu alte numere din listă fr, și poziția sa în lista poz. Apoi, funcția calculează numărul de perechi de cifre comune pentru fiecare pereche posibilă de numere din listă și actualizează câmpul fr pentru fiecare obiect Forta. La final, lista de obiecte Forta este sortată în ordinea descrescătoare a valorii fr și a poziției poz, și valorile val ale obiectelor sunt extrase într-o listă separată, care este returnată de funcție.&lt;br /&gt;
&lt;br /&gt;
main(): Această funcție este punctul de intrare în program și se ocupă de citirea datelor din fișierul de intrare, apelarea funcției validare_date() pentru a verifica dacă datele sunt valide, apelarea funcției rezolvare_problema() pentru a rezolva problema descrisă în enunțul problemei și afișarea rezultatului în fișierul de ieșire. Dacă datele nu sunt valide, programul se va termina cu exit(0).&lt;/div&gt;</summary>
		<author><name>Sovago Rares-Andrei</name></author>
	</entry>
	<entry>
		<id>https://wiki.universitas.ro/index.php?title=3538_-_SiruriPrietene&amp;diff=5494</id>
		<title>3538 - SiruriPrietene</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=3538_-_SiruriPrietene&amp;diff=5494"/>
		<updated>2023-04-29T16:18:45Z</updated>

		<summary type="html">&lt;p&gt;Sovago Rares-Andrei: /* Date de ieșire */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Cerința==&lt;br /&gt;
&lt;br /&gt;
Se dau două șiruri de caractere formate din litere mici ale alfabetului englez. Să se afle dacă aceste șiruri sunt prietene. Un șir de caractere este prieten cu un alt șir de caractere dacă se poate obține din acesta prin inversarea, ori de câte ori, a caracterelor sale, cu mențiunea că nu se pot inversa între ele decât caractere de pe poziții cu aceeași paritate.&lt;br /&gt;
== Date de intrare ==&lt;br /&gt;
&lt;br /&gt;
Programul citește de la tastatură două șiruri de caractere &#039;&#039;&#039;a&#039;&#039;&#039; și &#039;&#039;&#039;b&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
== Date de ieșire ==&lt;br /&gt;
&lt;br /&gt;
Dacă datele sunt introduse corect, pe ecran se va afișa: &amp;quot;Datele sunt introduse corect.&amp;quot; Programul va afișa pe ecran mesajul &#039;&#039;&#039;PRIETENE&#039;&#039;&#039;, dacă cele două șiruri &#039;&#039;&#039;a&#039;&#039;&#039; și &#039;&#039;&#039;b&#039;&#039;&#039; sunt prietene, respectiv mesajul &#039;&#039;&#039;NU SUNT PRIETENE&#039;&#039;&#039;, dacă cele două șiruri &#039;&#039;&#039;a&#039;&#039;&#039; și &#039;&#039;&#039;b&#039;&#039;&#039; nu sunt prietene. În cazul în care datele nu respectă restricțiile, se va afișa: &amp;quot;Datele nu corespund restricțiilor impuse.&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
== Restricţii şi precizări ==&lt;br /&gt;
*cele două șiruri au maxim 100 de caractere fiecare;&lt;br /&gt;
*pozițiile caracterelor în șir sunt numerotate începând cu 0.&lt;br /&gt;
== Exemple ==&lt;br /&gt;
===Exemplul 1===&lt;br /&gt;
; &#039;&#039;Intrare&#039;&#039;&lt;br /&gt;
:rutina	&lt;br /&gt;
:naturi&lt;br /&gt;
; &#039;&#039;Ieșire&#039;&#039;&lt;br /&gt;
:Datele sunt introduse corect.&lt;br /&gt;
:PRIETENE&lt;br /&gt;
&lt;br /&gt;
===Exemplul 2===&lt;br /&gt;
; &#039;&#039;Intrare&#039;&#039;&lt;br /&gt;
:rutina	&lt;br /&gt;
:unitar&lt;br /&gt;
; &#039;&#039;Iesire&#039;&#039;&lt;br /&gt;
:Datele sunt introduse corect.&lt;br /&gt;
:NU SUNT PRIETENE&lt;br /&gt;
&lt;br /&gt;
===Exemplul 3===&lt;br /&gt;
; &#039;&#039;Intrare&#039;&#039;&lt;br /&gt;
:abcd&lt;br /&gt;
:abdc&lt;br /&gt;
; &#039;&#039;Ieșire&#039;&#039;&lt;br /&gt;
:Datele sunt introduse corect.&lt;br /&gt;
:NU SUNT PRIETENE&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Rezolvare == &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
# 3538 - SiruriPrietene&lt;br /&gt;
def validare_date(a, b):&lt;br /&gt;
    if len(a) == 0 or len(b) == 0:&lt;br /&gt;
        return False&lt;br /&gt;
    return True&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def rezolvare(a, b):&lt;br /&gt;
    frecvente_pozitii_pare = {}&lt;br /&gt;
    frecvente_pozitii_impare = {}&lt;br /&gt;
&lt;br /&gt;
    for i in range(len(a)):&lt;br /&gt;
        caracter = a[i]&lt;br /&gt;
        if i % 2 == 0:&lt;br /&gt;
            if caracter not in frecvente_pozitii_pare:&lt;br /&gt;
                frecvente_pozitii_pare[caracter] = 0&lt;br /&gt;
            frecvente_pozitii_pare[caracter] += 1&lt;br /&gt;
        else:&lt;br /&gt;
            if caracter not in frecvente_pozitii_impare:&lt;br /&gt;
                frecvente_pozitii_impare[caracter] = 0&lt;br /&gt;
            frecvente_pozitii_impare[caracter] += 1&lt;br /&gt;
&lt;br /&gt;
    ok = True&lt;br /&gt;
&lt;br /&gt;
    for i in range(len(b)):&lt;br /&gt;
        caracter = b[i]&lt;br /&gt;
        if i % 2 == 0:&lt;br /&gt;
            if caracter in frecvente_pozitii_pare and frecvente_pozitii_pare[caracter] &amp;gt; 0:&lt;br /&gt;
                frecvente_pozitii_pare[caracter] -= 1&lt;br /&gt;
            else:&lt;br /&gt;
                ok = False&lt;br /&gt;
                break&lt;br /&gt;
        else:&lt;br /&gt;
            if caracter in frecvente_pozitii_impare and frecvente_pozitii_impare[caracter] &amp;gt; 0:&lt;br /&gt;
                frecvente_pozitii_impare[caracter] -= 1&lt;br /&gt;
            else:&lt;br /&gt;
                ok = False&lt;br /&gt;
                break&lt;br /&gt;
&lt;br /&gt;
    return ok&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
if __name__ == &#039;__main__&#039;:&lt;br /&gt;
    a = input()[:100]&lt;br /&gt;
    b = input()[:100]&lt;br /&gt;
    if not validare_date(a, b):&lt;br /&gt;
        print(&amp;quot;Datele nu corespund restricțiilor impuse.&amp;quot;)&lt;br /&gt;
    else:&lt;br /&gt;
        print(&amp;quot;Datele sunt introduse corect.&amp;quot;)&lt;br /&gt;
        if rezolvare(a, b):&lt;br /&gt;
            print(&amp;quot;PRIETENE&amp;quot;)&lt;br /&gt;
        else:&lt;br /&gt;
            print(&amp;quot;NU SUNT PRIETENE&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Explicatie==&lt;br /&gt;
&lt;br /&gt;
Funcția validare_date(a, b) - această funcție primește două șiruri de caractere a și b ca argumente și verifică dacă acestea respectă restricțiile impuse, și anume dacă lungimea lor este mai mică sau egală cu 100. Funcția returnează o valoare booleană, True dacă datele sunt valide și False în caz contrar.&lt;br /&gt;
&lt;br /&gt;
Funcția rezolvare(a, b) - această funcție primește două șiruri de caractere a și b ca argumente și verifică dacă acestea sunt prietene, adică dacă caracterele de pe pozițiile pare din șirul a coincid cu cele de pe pozițiile impare din șirul b, și viceversa. Funcția utilizează două dicționare pentru a număra aparițiile fiecărui caracter de pe pozițiile pare și impare din șirul a. Pentru fiecare caracter de pe poziția i din șirul b, funcția verifică dacă acesta apare în dicționarul corespunzător (adică pentru poziții pare/impare) și dacă numărul de apariții rămase pentru acel caracter este mai mare decât 0. Dacă una dintre aceste condiții nu este îndeplinită, funcția returnează False. Altfel, funcția returnează True.&lt;br /&gt;
&lt;br /&gt;
Funcția main() - această funcție primește datele de intrare de la utilizator și apelează funcția validare_date() pentru a verifica dacă acestea sunt valide. Dacă datele sunt valide, funcția apelează funcția rezolvare() pentru a verifica dacă cele două șiruri de caractere sunt prietene și afișează mesajul corespunzător. Dacă datele nu sunt valide, funcția afișează un mesaj corespunzător.&lt;/div&gt;</summary>
		<author><name>Sovago Rares-Andrei</name></author>
	</entry>
	<entry>
		<id>https://wiki.universitas.ro/index.php?title=3538_-_SiruriPrietene&amp;diff=5492</id>
		<title>3538 - SiruriPrietene</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=3538_-_SiruriPrietene&amp;diff=5492"/>
		<updated>2023-04-29T16:18:08Z</updated>

		<summary type="html">&lt;p&gt;Sovago Rares-Andrei: /* Date de ieșire */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Cerința==&lt;br /&gt;
&lt;br /&gt;
Se dau două șiruri de caractere formate din litere mici ale alfabetului englez. Să se afle dacă aceste șiruri sunt prietene. Un șir de caractere este prieten cu un alt șir de caractere dacă se poate obține din acesta prin inversarea, ori de câte ori, a caracterelor sale, cu mențiunea că nu se pot inversa între ele decât caractere de pe poziții cu aceeași paritate.&lt;br /&gt;
== Date de intrare ==&lt;br /&gt;
&lt;br /&gt;
Programul citește de la tastatură două șiruri de caractere &#039;&#039;&#039;a&#039;&#039;&#039; și &#039;&#039;&#039;b&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
== Date de ieșire ==&lt;br /&gt;
&lt;br /&gt;
Dacă datele sunt introduse corect, pe ecran se va afișa: &amp;quot;Datele sunt introduse corect.&amp;quot; Programul va afișa pe ecran mesajul &#039;&#039;&#039;PRIETENE&#039;&#039;&#039;, dacă cele două șiruri &#039;&#039;&#039;a&#039;&#039;&#039; și &#039;&#039;&#039;b&#039;&#039;&#039; sunt prietene, respectiv mesajul &#039;&#039;&#039;NU SUNT PRIETENE&#039;&#039;&#039;, dacă cele două șiruri a și b nu sunt prietene. În cazul în care datele nu respectă restricțiile, se va afișa: &amp;quot;Datele nu corespund restricțiilor impuse.&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
== Restricţii şi precizări ==&lt;br /&gt;
*cele două șiruri au maxim 100 de caractere fiecare;&lt;br /&gt;
*pozițiile caracterelor în șir sunt numerotate începând cu 0.&lt;br /&gt;
== Exemple ==&lt;br /&gt;
===Exemplul 1===&lt;br /&gt;
; &#039;&#039;Intrare&#039;&#039;&lt;br /&gt;
:rutina	&lt;br /&gt;
:naturi&lt;br /&gt;
; &#039;&#039;Ieșire&#039;&#039;&lt;br /&gt;
:Datele sunt introduse corect.&lt;br /&gt;
:PRIETENE&lt;br /&gt;
&lt;br /&gt;
===Exemplul 2===&lt;br /&gt;
; &#039;&#039;Intrare&#039;&#039;&lt;br /&gt;
:rutina	&lt;br /&gt;
:unitar&lt;br /&gt;
; &#039;&#039;Iesire&#039;&#039;&lt;br /&gt;
:Datele sunt introduse corect.&lt;br /&gt;
:NU SUNT PRIETENE&lt;br /&gt;
&lt;br /&gt;
===Exemplul 3===&lt;br /&gt;
; &#039;&#039;Intrare&#039;&#039;&lt;br /&gt;
:abcd&lt;br /&gt;
:abdc&lt;br /&gt;
; &#039;&#039;Ieșire&#039;&#039;&lt;br /&gt;
:Datele sunt introduse corect.&lt;br /&gt;
:NU SUNT PRIETENE&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Rezolvare == &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
# 3538 - SiruriPrietene&lt;br /&gt;
def validare_date(a, b):&lt;br /&gt;
    if len(a) == 0 or len(b) == 0:&lt;br /&gt;
        return False&lt;br /&gt;
    return True&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def rezolvare(a, b):&lt;br /&gt;
    frecvente_pozitii_pare = {}&lt;br /&gt;
    frecvente_pozitii_impare = {}&lt;br /&gt;
&lt;br /&gt;
    for i in range(len(a)):&lt;br /&gt;
        caracter = a[i]&lt;br /&gt;
        if i % 2 == 0:&lt;br /&gt;
            if caracter not in frecvente_pozitii_pare:&lt;br /&gt;
                frecvente_pozitii_pare[caracter] = 0&lt;br /&gt;
            frecvente_pozitii_pare[caracter] += 1&lt;br /&gt;
        else:&lt;br /&gt;
            if caracter not in frecvente_pozitii_impare:&lt;br /&gt;
                frecvente_pozitii_impare[caracter] = 0&lt;br /&gt;
            frecvente_pozitii_impare[caracter] += 1&lt;br /&gt;
&lt;br /&gt;
    ok = True&lt;br /&gt;
&lt;br /&gt;
    for i in range(len(b)):&lt;br /&gt;
        caracter = b[i]&lt;br /&gt;
        if i % 2 == 0:&lt;br /&gt;
            if caracter in frecvente_pozitii_pare and frecvente_pozitii_pare[caracter] &amp;gt; 0:&lt;br /&gt;
                frecvente_pozitii_pare[caracter] -= 1&lt;br /&gt;
            else:&lt;br /&gt;
                ok = False&lt;br /&gt;
                break&lt;br /&gt;
        else:&lt;br /&gt;
            if caracter in frecvente_pozitii_impare and frecvente_pozitii_impare[caracter] &amp;gt; 0:&lt;br /&gt;
                frecvente_pozitii_impare[caracter] -= 1&lt;br /&gt;
            else:&lt;br /&gt;
                ok = False&lt;br /&gt;
                break&lt;br /&gt;
&lt;br /&gt;
    return ok&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
if __name__ == &#039;__main__&#039;:&lt;br /&gt;
    a = input()[:100]&lt;br /&gt;
    b = input()[:100]&lt;br /&gt;
    if not validare_date(a, b):&lt;br /&gt;
        print(&amp;quot;Datele nu corespund restricțiilor impuse.&amp;quot;)&lt;br /&gt;
    else:&lt;br /&gt;
        print(&amp;quot;Datele sunt introduse corect.&amp;quot;)&lt;br /&gt;
        if rezolvare(a, b):&lt;br /&gt;
            print(&amp;quot;PRIETENE&amp;quot;)&lt;br /&gt;
        else:&lt;br /&gt;
            print(&amp;quot;NU SUNT PRIETENE&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Explicatie==&lt;br /&gt;
&lt;br /&gt;
Funcția validare_date(a, b) - această funcție primește două șiruri de caractere a și b ca argumente și verifică dacă acestea respectă restricțiile impuse, și anume dacă lungimea lor este mai mică sau egală cu 100. Funcția returnează o valoare booleană, True dacă datele sunt valide și False în caz contrar.&lt;br /&gt;
&lt;br /&gt;
Funcția rezolvare(a, b) - această funcție primește două șiruri de caractere a și b ca argumente și verifică dacă acestea sunt prietene, adică dacă caracterele de pe pozițiile pare din șirul a coincid cu cele de pe pozițiile impare din șirul b, și viceversa. Funcția utilizează două dicționare pentru a număra aparițiile fiecărui caracter de pe pozițiile pare și impare din șirul a. Pentru fiecare caracter de pe poziția i din șirul b, funcția verifică dacă acesta apare în dicționarul corespunzător (adică pentru poziții pare/impare) și dacă numărul de apariții rămase pentru acel caracter este mai mare decât 0. Dacă una dintre aceste condiții nu este îndeplinită, funcția returnează False. Altfel, funcția returnează True.&lt;br /&gt;
&lt;br /&gt;
Funcția main() - această funcție primește datele de intrare de la utilizator și apelează funcția validare_date() pentru a verifica dacă acestea sunt valide. Dacă datele sunt valide, funcția apelează funcția rezolvare() pentru a verifica dacă cele două șiruri de caractere sunt prietene și afișează mesajul corespunzător. Dacă datele nu sunt valide, funcția afișează un mesaj corespunzător.&lt;/div&gt;</summary>
		<author><name>Sovago Rares-Andrei</name></author>
	</entry>
	<entry>
		<id>https://wiki.universitas.ro/index.php?title=1546_-_mincifre&amp;diff=5491</id>
		<title>1546 - mincifre</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=1546_-_mincifre&amp;diff=5491"/>
		<updated>2023-04-29T16:17:18Z</updated>

		<summary type="html">&lt;p&gt;Sovago Rares-Andrei: /* Restricţii şi precizări */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Cerința==&lt;br /&gt;
&lt;br /&gt;
Se dă numărul natural &#039;&#039;&#039;n&#039;&#039;&#039; și se cere să se afișeze cel mai mic număr natural format din cifrele sale.&lt;br /&gt;
== Date de intrare ==&lt;br /&gt;
&lt;br /&gt;
Fișierul de intrare &#039;&#039;&#039;mincifre.in&#039;&#039;&#039; conține pe prima linie numărul &#039;&#039;&#039;n&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
== Date de ieșire ==&lt;br /&gt;
&lt;br /&gt;
Dacă datele sunt introduse corect, pe ecran se va afișa: &amp;quot;Datele sunt introduse corect.&amp;quot; Fișierul de ieșire &#039;&#039;&#039;mincifre.out&#039;&#039;&#039; va conține pe prima linie numărul m, reprezentând cel mai mic număr ce se poate forma cu cifrele numărului din fișierul de intrare. În cazul în care datele nu respectă restricțiile, se va afișa: &amp;quot;Datele nu corespund restricțiilor impuse.&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
== Restricţii şi precizări ==&lt;br /&gt;
*Numerele citite vor avea cel mult &#039;&#039;&#039;10.000&#039;&#039;&#039; de cifre.&lt;br /&gt;
&lt;br /&gt;
== Exemple ==&lt;br /&gt;
===Exemplul 1===&lt;br /&gt;
; &#039;&#039;mincifre.in&#039;&#039;&lt;br /&gt;
:1234567890&lt;br /&gt;
; &#039;&#039;ecran&#039;&#039;&lt;br /&gt;
:Datele sunt introduse corect.&lt;br /&gt;
; &#039;&#039;mincifre.out&#039;&#039;&lt;br /&gt;
:1023456789&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Exemplul 2===&lt;br /&gt;
; &#039;&#039;mincifre.in&#039;&#039;&lt;br /&gt;
:321&lt;br /&gt;
; &#039;&#039;ecran&#039;&#039;&lt;br /&gt;
:Datele sunt introduse corect.&lt;br /&gt;
; &#039;&#039;mincifre.out&#039;&#039;&lt;br /&gt;
:123&lt;br /&gt;
&lt;br /&gt;
===Exemplul 3===&lt;br /&gt;
; &#039;&#039;mincifre.in&#039;&#039;&lt;br /&gt;
:12a34&lt;br /&gt;
; &#039;&#039;ecran&#039;&#039;&lt;br /&gt;
:Datele nu corespund restricțiilor impuse.&lt;br /&gt;
; &#039;&#039;mincifre.out&#039;&#039;&lt;br /&gt;
:&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Rezolvare == &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
# 1546 - mincifre&lt;br /&gt;
def valideaza_input(n):&lt;br /&gt;
    # Verificăm dacă numărul introdus are cel mult 10.000 de cifre și este un număr natural&lt;br /&gt;
    if not n.isdigit() or len(n) &amp;gt; 10000:&lt;br /&gt;
        return False&lt;br /&gt;
    return True&lt;br /&gt;
&lt;br /&gt;
def cel_mai_mic_numar(n):&lt;br /&gt;
    # Sortăm cifrele numărului și formăm cel mai mic număr natural&lt;br /&gt;
    cifre = [0] * 10&lt;br /&gt;
    for cifra in n:&lt;br /&gt;
        cifre[int(cifra)] += 1&lt;br /&gt;
&lt;br /&gt;
    if cifre[0] == len(n):&lt;br /&gt;
        return &amp;quot;0&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    numar_format = &amp;quot;&amp;quot;&lt;br /&gt;
    for i in range(1, 10):&lt;br /&gt;
        if cifre[i] &amp;gt; 0:&lt;br /&gt;
            numar_format += str(i)&lt;br /&gt;
            cifre[i] -= 1&lt;br /&gt;
            break&lt;br /&gt;
&lt;br /&gt;
    for i in range(10):&lt;br /&gt;
        while cifre[i] &amp;gt; 0:&lt;br /&gt;
            numar_format += str(i)&lt;br /&gt;
            cifre[i] -= 1&lt;br /&gt;
&lt;br /&gt;
    return numar_format&lt;br /&gt;
&lt;br /&gt;
if __name__ == &#039;__main__&#039;:&lt;br /&gt;
    # Citim datele de intrare din fișier&lt;br /&gt;
    with open(&#039;mincifre.in&#039;, &#039;r&#039;) as f:&lt;br /&gt;
        n = f.readline().strip()&lt;br /&gt;
&lt;br /&gt;
    # Verificăm validitatea datelor de intrare&lt;br /&gt;
    if not valideaza_input(n):&lt;br /&gt;
        print(&amp;quot;Datele nu corespund restricțiilor impuse.&amp;quot;)&lt;br /&gt;
    else:&lt;br /&gt;
        print(&amp;quot;Datele sunt introduse corect.&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
        # Calculăm rezultatul și îl scriem în fișierul de ieșire&lt;br /&gt;
        with open(&#039;mincifre.out&#039;, &#039;w&#039;) as g:&lt;br /&gt;
            g.write(cel_mai_mic_numar(n))&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Explicatie==&lt;br /&gt;
&lt;br /&gt;
Funcția valideaza_input primește un string n și verifică dacă acesta este un număr natural cu cel mult 10.000 de cifre. Dacă n nu este un astfel de număr, funcția va returna False, altfel va returna True.&lt;br /&gt;
&lt;br /&gt;
Funcția cel_mai_mic_numar primește un string n reprezentând un număr natural cu cel mult 10.000 de cifre și calculează cel mai mic număr natural ce poate fi format din cifrele lui n. Pentru aceasta, numărul n este convertit într-un array de frecvență a cifrelor. Mai întâi, se verifică cazul în care n conține doar cifra 0, caz în care cel mai mic număr natural ce poate fi format este 0. În caz contrar, cifrele sunt sortate astfel încât să se formeze cel mai mic număr natural posibil și acesta este returnat sub forma unui string.&lt;br /&gt;
&lt;br /&gt;
În if __name__ == &#039;__main__&#039;: se citesc datele de intrare din fișierul mincifre.in, se verifică dacă acestea sunt valide folosind funcția valideaza_input și se afișează un mesaj corespunzător. Dacă datele sunt valide, se calculează cel mai mic număr natural ce poate fi format din cifrele lui n folosind funcția cel_mai_mic_numar, iar rezultatul este scris în fișierul de ieșire mincifre.out.&lt;/div&gt;</summary>
		<author><name>Sovago Rares-Andrei</name></author>
	</entry>
	<entry>
		<id>https://wiki.universitas.ro/index.php?title=1546_-_mincifre&amp;diff=5490</id>
		<title>1546 - mincifre</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=1546_-_mincifre&amp;diff=5490"/>
		<updated>2023-04-29T16:16:57Z</updated>

		<summary type="html">&lt;p&gt;Sovago Rares-Andrei: /* Date de ieșire */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Cerința==&lt;br /&gt;
&lt;br /&gt;
Se dă numărul natural &#039;&#039;&#039;n&#039;&#039;&#039; și se cere să se afișeze cel mai mic număr natural format din cifrele sale.&lt;br /&gt;
== Date de intrare ==&lt;br /&gt;
&lt;br /&gt;
Fișierul de intrare &#039;&#039;&#039;mincifre.in&#039;&#039;&#039; conține pe prima linie numărul &#039;&#039;&#039;n&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
== Date de ieșire ==&lt;br /&gt;
&lt;br /&gt;
Dacă datele sunt introduse corect, pe ecran se va afișa: &amp;quot;Datele sunt introduse corect.&amp;quot; Fișierul de ieșire &#039;&#039;&#039;mincifre.out&#039;&#039;&#039; va conține pe prima linie numărul m, reprezentând cel mai mic număr ce se poate forma cu cifrele numărului din fișierul de intrare. În cazul în care datele nu respectă restricțiile, se va afișa: &amp;quot;Datele nu corespund restricțiilor impuse.&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
== Restricţii şi precizări ==&lt;br /&gt;
*Numerele citite vor avea cel mult 10.000 de cifre.&lt;br /&gt;
== Exemple ==&lt;br /&gt;
===Exemplul 1===&lt;br /&gt;
; &#039;&#039;mincifre.in&#039;&#039;&lt;br /&gt;
:1234567890&lt;br /&gt;
; &#039;&#039;ecran&#039;&#039;&lt;br /&gt;
:Datele sunt introduse corect.&lt;br /&gt;
; &#039;&#039;mincifre.out&#039;&#039;&lt;br /&gt;
:1023456789&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Exemplul 2===&lt;br /&gt;
; &#039;&#039;mincifre.in&#039;&#039;&lt;br /&gt;
:321&lt;br /&gt;
; &#039;&#039;ecran&#039;&#039;&lt;br /&gt;
:Datele sunt introduse corect.&lt;br /&gt;
; &#039;&#039;mincifre.out&#039;&#039;&lt;br /&gt;
:123&lt;br /&gt;
&lt;br /&gt;
===Exemplul 3===&lt;br /&gt;
; &#039;&#039;mincifre.in&#039;&#039;&lt;br /&gt;
:12a34&lt;br /&gt;
; &#039;&#039;ecran&#039;&#039;&lt;br /&gt;
:Datele nu corespund restricțiilor impuse.&lt;br /&gt;
; &#039;&#039;mincifre.out&#039;&#039;&lt;br /&gt;
:&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Rezolvare == &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
# 1546 - mincifre&lt;br /&gt;
def valideaza_input(n):&lt;br /&gt;
    # Verificăm dacă numărul introdus are cel mult 10.000 de cifre și este un număr natural&lt;br /&gt;
    if not n.isdigit() or len(n) &amp;gt; 10000:&lt;br /&gt;
        return False&lt;br /&gt;
    return True&lt;br /&gt;
&lt;br /&gt;
def cel_mai_mic_numar(n):&lt;br /&gt;
    # Sortăm cifrele numărului și formăm cel mai mic număr natural&lt;br /&gt;
    cifre = [0] * 10&lt;br /&gt;
    for cifra in n:&lt;br /&gt;
        cifre[int(cifra)] += 1&lt;br /&gt;
&lt;br /&gt;
    if cifre[0] == len(n):&lt;br /&gt;
        return &amp;quot;0&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    numar_format = &amp;quot;&amp;quot;&lt;br /&gt;
    for i in range(1, 10):&lt;br /&gt;
        if cifre[i] &amp;gt; 0:&lt;br /&gt;
            numar_format += str(i)&lt;br /&gt;
            cifre[i] -= 1&lt;br /&gt;
            break&lt;br /&gt;
&lt;br /&gt;
    for i in range(10):&lt;br /&gt;
        while cifre[i] &amp;gt; 0:&lt;br /&gt;
            numar_format += str(i)&lt;br /&gt;
            cifre[i] -= 1&lt;br /&gt;
&lt;br /&gt;
    return numar_format&lt;br /&gt;
&lt;br /&gt;
if __name__ == &#039;__main__&#039;:&lt;br /&gt;
    # Citim datele de intrare din fișier&lt;br /&gt;
    with open(&#039;mincifre.in&#039;, &#039;r&#039;) as f:&lt;br /&gt;
        n = f.readline().strip()&lt;br /&gt;
&lt;br /&gt;
    # Verificăm validitatea datelor de intrare&lt;br /&gt;
    if not valideaza_input(n):&lt;br /&gt;
        print(&amp;quot;Datele nu corespund restricțiilor impuse.&amp;quot;)&lt;br /&gt;
    else:&lt;br /&gt;
        print(&amp;quot;Datele sunt introduse corect.&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
        # Calculăm rezultatul și îl scriem în fișierul de ieșire&lt;br /&gt;
        with open(&#039;mincifre.out&#039;, &#039;w&#039;) as g:&lt;br /&gt;
            g.write(cel_mai_mic_numar(n))&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Explicatie==&lt;br /&gt;
&lt;br /&gt;
Funcția valideaza_input primește un string n și verifică dacă acesta este un număr natural cu cel mult 10.000 de cifre. Dacă n nu este un astfel de număr, funcția va returna False, altfel va returna True.&lt;br /&gt;
&lt;br /&gt;
Funcția cel_mai_mic_numar primește un string n reprezentând un număr natural cu cel mult 10.000 de cifre și calculează cel mai mic număr natural ce poate fi format din cifrele lui n. Pentru aceasta, numărul n este convertit într-un array de frecvență a cifrelor. Mai întâi, se verifică cazul în care n conține doar cifra 0, caz în care cel mai mic număr natural ce poate fi format este 0. În caz contrar, cifrele sunt sortate astfel încât să se formeze cel mai mic număr natural posibil și acesta este returnat sub forma unui string.&lt;br /&gt;
&lt;br /&gt;
În if __name__ == &#039;__main__&#039;: se citesc datele de intrare din fișierul mincifre.in, se verifică dacă acestea sunt valide folosind funcția valideaza_input și se afișează un mesaj corespunzător. Dacă datele sunt valide, se calculează cel mai mic număr natural ce poate fi format din cifrele lui n folosind funcția cel_mai_mic_numar, iar rezultatul este scris în fișierul de ieșire mincifre.out.&lt;/div&gt;</summary>
		<author><name>Sovago Rares-Andrei</name></author>
	</entry>
	<entry>
		<id>https://wiki.universitas.ro/index.php?title=2342_-_cadouri2&amp;diff=5489</id>
		<title>2342 - cadouri2</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=2342_-_cadouri2&amp;diff=5489"/>
		<updated>2023-04-29T16:15:49Z</updated>

		<summary type="html">&lt;p&gt;Sovago Rares-Andrei: /* Cerința */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Cerința==&lt;br /&gt;
&lt;br /&gt;
După ce au trecut sărbătorile, ca în fiecare an, Moș Crăciun a început să facă inventarul cadourilor rămase pentru anul următor. El are &#039;&#039;&#039;N&#039;&#039;&#039; cadouri și pe fiecare cadou este scris un număr natural. În fiecare an Moș Crăciun trebuie să noteze într-un carnețel cantitatea de fericire pe care o aduc aceste cadouri copiilor.&lt;br /&gt;
&lt;br /&gt;
Pentru a calcula această valoare, prima dată el trebuie să înmulțească toate numerele înscrise pe cele N cadouri. Astfel el obține un număr foarte mare. Apoi el știe că numărul de divizori al acestui număr este cantitatea de fericire pe care el trebuie să o scrie în carnețel. Ajutați-l pe Moș Crăciun să afle cantitatea de fericire a celor N cadouri. Deoarece acest număr este foarte mare voi trebuie sa aflați doar restul împărțirii la &#039;&#039;&#039;1.000.000.007&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
== Date de intrare ==&lt;br /&gt;
&lt;br /&gt;
Pe prima linie a fișierului de intrare &#039;&#039;&#039;​cadouri2.in&#039;&#039;&#039;​ se află numărul natural N. Pe următoarea linie se află N numere naturale reprezentând numerele care sunt scrise pe cele &#039;&#039;&#039;N&#039;&#039;&#039; cadouri.&lt;br /&gt;
&lt;br /&gt;
== Date de ieșire ==&lt;br /&gt;
&lt;br /&gt;
Dacă datele sunt introduse corect, pe ecran se va afișa: &amp;quot;Datele sunt introduse corect.&amp;quot; In fișierul de ieșire &#039;&#039;&#039;​cadouri2.out&#039;&#039;&#039; ​trebuie să se afle un singur număr care reprezintă cantitatea de fericire a celor N cadouri modulo &#039;&#039;&#039;1.000.000.007&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
În cazul în care datele nu respectă restricțiile, se va afișa: &amp;quot;Datele nu corespund restricțiilor impuse.&amp;quot;.&lt;br /&gt;
== Restricţii şi precizări ==&lt;br /&gt;
*1 ≤ N ≤ 1000&lt;br /&gt;
*Numerele înscrise pe cadouri sunt numere naturale cuprinse între 1 și 10​6&lt;br /&gt;
== Exemple ==&lt;br /&gt;
===Exemplul 1===&lt;br /&gt;
; &#039;&#039;cadouri2.in&#039;&#039;&lt;br /&gt;
:3 &lt;br /&gt;
:2 3 4&lt;br /&gt;
; &#039;&#039;ecran&#039;&#039;&lt;br /&gt;
:Datele sunt introduse corect.&lt;br /&gt;
; &#039;&#039;cadouri2.out&#039;&#039;&lt;br /&gt;
:8&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Exemplul 2===&lt;br /&gt;
; &#039;&#039;cadouri2.in&#039;&#039;&lt;br /&gt;
:5 &lt;br /&gt;
:12 24 3 7 15&lt;br /&gt;
; &#039;&#039;ecran&#039;&#039;&lt;br /&gt;
:Datele sunt introduse corect.&lt;br /&gt;
; &#039;&#039;cadouri2.out&#039;&#039;&lt;br /&gt;
:120&lt;br /&gt;
&lt;br /&gt;
===Exemplul 3===&lt;br /&gt;
; &#039;&#039;cadouri2.in&#039;&#039;&lt;br /&gt;
:5&lt;br /&gt;
:10000000 1 1 1 1&lt;br /&gt;
; &#039;&#039;ecran&#039;&#039;&lt;br /&gt;
:Datele nu corespund restricțiilor impuse.&lt;br /&gt;
; &#039;&#039;cadouri2.out&#039;&#039;&lt;br /&gt;
:&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Rezolvare == &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
# 2342 - cadouri2&lt;br /&gt;
import math&lt;br /&gt;
&lt;br /&gt;
# Funcție pentru validarea datelor de intrare&lt;br /&gt;
def validate_input(n, a):&lt;br /&gt;
    if not (1 &amp;lt;= n &amp;lt;= 1000):&lt;br /&gt;
        return False&lt;br /&gt;
    if not all(1 &amp;lt;= x &amp;lt;= 10**6 for x in a):&lt;br /&gt;
        return False&lt;br /&gt;
    return True&lt;br /&gt;
&lt;br /&gt;
# Funcție pentru calcularea produsului factorilor primi ai tuturor numerelor și numărul de apariții a fiecărui factor prim&lt;br /&gt;
def calculate_factors(n, a):&lt;br /&gt;
    primes = []&lt;br /&gt;
    for i in range(2, int(math.sqrt(10**6)) + 1):&lt;br /&gt;
        if all(i % p != 0 for p in primes):&lt;br /&gt;
            primes.append(i)&lt;br /&gt;
&lt;br /&gt;
    freq = [0] * len(primes)&lt;br /&gt;
    for num in a:&lt;br /&gt;
        for i in range(len(primes)):&lt;br /&gt;
            while num % primes[i] == 0:&lt;br /&gt;
                freq[i] += 1&lt;br /&gt;
                num //= primes[i]&lt;br /&gt;
&lt;br /&gt;
    result = 1&lt;br /&gt;
    for f in freq:&lt;br /&gt;
        result = (result * (f + 1)) % 1_000_000_007&lt;br /&gt;
&lt;br /&gt;
    return result&lt;br /&gt;
&lt;br /&gt;
if __name__ == &#039;__main__&#039;:&lt;br /&gt;
    # Citim datele de intrare din fișier&lt;br /&gt;
    with open(&#039;cadouri2.in&#039;, &#039;r&#039;) as f:&lt;br /&gt;
        n = int(f.readline().strip())&lt;br /&gt;
        a = list(map(int, f.readline().strip().split()))&lt;br /&gt;
&lt;br /&gt;
    # Verificăm validitatea datelor de intrare&lt;br /&gt;
    if not validate_input(n, a):&lt;br /&gt;
        print(&amp;quot;Datele nu corespund restricțiilor impuse.&amp;quot;)&lt;br /&gt;
    else:&lt;br /&gt;
        print(&amp;quot;Datele sunt introduse corect.&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
        # Calculăm rezultatul și îl scriem în fișierul de ieșire&lt;br /&gt;
        with open(&#039;cadouri2.out&#039;, &#039;w&#039;) as g:&lt;br /&gt;
            g.write(str(calculate_factors(n, a))))&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Explicatie==&lt;br /&gt;
&lt;br /&gt;
calculate_factors(n, a): această funcție primește ca parametri un număr întreg n și un vector a de dimensiune n care conține numere naturale. Scopul acestei funcții este să calculeze produsul numărului de divizori ai fiecărui număr din vectorul a. Pentru a face acest lucru, funcția iterează prin fiecare element din vectorul a și calculează divizorii acelui număr. Acești divizori sunt stocați într-un dicționar care numără de câte ori apare fiecare divizor. La final, funcția calculează produsul dintre numărul de divizori pentru fiecare element și returnează rezultatul.&lt;br /&gt;
&lt;br /&gt;
validate_input(n, a): această funcție primește ca parametri un număr întreg n și un vector a de dimensiune n care conține numere naturale. Scopul acestei funcții este să valideze datele de intrare și să verifice dacă respectă restricțiile impuse. Funcția verifică dacă n și fiecare element din vectorul a sunt numere naturale nenule, mai mici sau egale cu 10^6. De asemenea, funcția verifică dacă produsul elementelor din vectorul a este mai mic sau egal cu 10^9 sau 10^12, în funcție de valoarea lui n. Funcția returnează True dacă datele de intrare sunt valide și False în caz contrar.&lt;br /&gt;
&lt;br /&gt;
main(): această funcție este funcția principală a programului. Ea deschide fișierul de intrare, citește datele de intrare și validează datele folosind funcția validate_input(). Dacă datele sunt invalide, funcția afișează un mesaj corespunzător și se oprește. Dacă datele sunt valide, funcția calculează produsul numărului de divizori folosind funcția calculate_factors(), apoi afișează rezultatul pe ecran și îl scrie în fișierul de ieșire.&lt;/div&gt;</summary>
		<author><name>Sovago Rares-Andrei</name></author>
	</entry>
	<entry>
		<id>https://wiki.universitas.ro/index.php?title=1902_-_DouaMii17&amp;diff=5487</id>
		<title>1902 - DouaMii17</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=1902_-_DouaMii17&amp;diff=5487"/>
		<updated>2023-04-29T15:53:32Z</updated>

		<summary type="html">&lt;p&gt;Sovago Rares-Andrei: /* Explicatie */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Cerința==&lt;br /&gt;
&lt;br /&gt;
Primele 2017 numere naturale, având fiecare exact 2017 divizori naturali, s-au gândit la început de nou an să-şi pună divizorii împreună, în ordine crescătoare, astfel se vor amesteca şi vor mai socializa şi ei în mod democratic. Marele conducător KWI s-a gândit să bage zâzanie între ei şi a început să le pună n întrebări de genul “-Domnule x, faci cumva parte din societatea secretă a divizorilor celor 2017 numere cu câte 2017 divizori?”. Să sperăm că până în anul 2017 va primi toate răspunsurile şi toată lumea va fi fericită.&lt;br /&gt;
== Date de intrare ==&lt;br /&gt;
&lt;br /&gt;
Fișierul de intrare &#039;&#039;&#039;douamii17.in&#039;&#039;&#039; conține pe prima linie numărul n, iar pe a doua linie n numere naturale separate prin spații, pentru care trebuie să verificăm dacă se află în şirul divizorilor primelor 2017 numere naturale care au exact 2017 divizori fiecare.&lt;br /&gt;
&lt;br /&gt;
== Date de ieșire ==&lt;br /&gt;
&lt;br /&gt;
Dacă datele sunt introduse corect, pe ecran se va afișa: &amp;quot;Datele sunt introduse corect.&amp;quot; Fișierul de ieșire &#039;&#039;&#039;douamii17.out&#039;&#039;&#039; va conține pe linia i, pentru fiecare i de la 1 la n, 1 dacă al i-lea număr de pe linia a doua a fişierului de intrare se află în şirul divizorilor şi 0 altfel.&lt;br /&gt;
&lt;br /&gt;
În cazul în care datele nu respectă restricțiile, se va afișa: &amp;quot;Datele nu corespund restricțiilor impuse.&amp;quot;.&lt;br /&gt;
== Restricţii şi precizări ==&lt;br /&gt;
*1 ≤ n ≤ 1.000.000&lt;br /&gt;
*numerele de pe a doua linie a fișierului de intrare vor fi mai mici decât &#039;&#039;&#039;500.000.000&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
== Exemple ==&lt;br /&gt;
===Exemplul 1===&lt;br /&gt;
; &#039;&#039;douamii17.in&#039;&#039;&lt;br /&gt;
:5&lt;br /&gt;
:1 2 18 23 9&lt;br /&gt;
; &#039;&#039;ecran&#039;&#039;&lt;br /&gt;
:Datele sunt introduse corect.&lt;br /&gt;
; &#039;&#039;douamii17.out&#039;&#039;&lt;br /&gt;
:1&lt;br /&gt;
:1&lt;br /&gt;
:0&lt;br /&gt;
:1&lt;br /&gt;
:1&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Exemplul 2===&lt;br /&gt;
; &#039;&#039;douamii17.in&#039;&#039;&lt;br /&gt;
:5&lt;br /&gt;
:10 20 30 40 50&lt;br /&gt;
; &#039;&#039;ecran&#039;&#039;&lt;br /&gt;
:Datele sunt introduse corect.&lt;br /&gt;
; &#039;&#039;douamii17.out&#039;&#039;&lt;br /&gt;
:0&lt;br /&gt;
:0&lt;br /&gt;
:0&lt;br /&gt;
:0&lt;br /&gt;
:0&lt;br /&gt;
&lt;br /&gt;
===Exemplul 3===&lt;br /&gt;
; &#039;&#039;douamii17.in&#039;&#039;&lt;br /&gt;
:3&lt;br /&gt;
:-5 1000000000 2000000000&lt;br /&gt;
; &#039;&#039;ecran&#039;&#039;&lt;br /&gt;
:Datele nu corespund restricțiilor impuse.&lt;br /&gt;
; &#039;&#039;douamii17.out&#039;&#039;&lt;br /&gt;
:&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Rezolvare == &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
# 1902 - DouaMii17&lt;br /&gt;
import math&lt;br /&gt;
&lt;br /&gt;
def is_valid(num_count, num_list):&lt;br /&gt;
    if num_count &amp;lt; 1 or num_count &amp;gt; 1000000:&lt;br /&gt;
        return False&lt;br /&gt;
    for num in num_list:&lt;br /&gt;
        if num &amp;lt; 1 or num &amp;gt;= 500000000:&lt;br /&gt;
            return False&lt;br /&gt;
    return True&lt;br /&gt;
&lt;br /&gt;
def calculate_divisors():&lt;br /&gt;
    prime_flags = [0] * 20001&lt;br /&gt;
    prime_list = []&lt;br /&gt;
    divisor_flags = [0] * (500000001)&lt;br /&gt;
    prime_count = 0&lt;br /&gt;
    current_num = 2&lt;br /&gt;
    while prime_count &amp;lt; 2017:&lt;br /&gt;
        if prime_flags[current_num] == 0:&lt;br /&gt;
            prime_count += 1&lt;br /&gt;
            prime_list.append(current_num)&lt;br /&gt;
            current_square = current_num * current_num&lt;br /&gt;
            while current_square &amp;lt; 20000:&lt;br /&gt;
                prime_flags[current_square] = 1&lt;br /&gt;
                current_square += current_num&lt;br /&gt;
        current_num += 1&lt;br /&gt;
&lt;br /&gt;
    divisor_flags[1] = 1&lt;br /&gt;
    for i in range(2017):&lt;br /&gt;
        current_prime = prime_list[i]&lt;br /&gt;
        while current_prime &amp;lt; 500000000:&lt;br /&gt;
            divisor_flags[current_prime] = 1&lt;br /&gt;
            current_prime *= prime_list[i]&lt;br /&gt;
&lt;br /&gt;
    return divisor_flags&lt;br /&gt;
&lt;br /&gt;
if __name__ == &amp;quot;__main__&amp;quot;:&lt;br /&gt;
    with open(&amp;quot;douamii17.in&amp;quot;) as input_file:&lt;br /&gt;
        num_count = int(input_file.readline().strip())&lt;br /&gt;
        num_list = list(map(int, input_file.readline().strip().split()))&lt;br /&gt;
        if not is_valid(num_count, num_list):&lt;br /&gt;
            print(&amp;quot;The data does not meet the required restrictions.&amp;quot;)&lt;br /&gt;
            exit(0)&lt;br /&gt;
&lt;br /&gt;
    divisors = calculate_divisors()&lt;br /&gt;
&lt;br /&gt;
    print(&amp;quot;The input data is correct.&amp;quot;)&lt;br /&gt;
    with open(&amp;quot;douamii17.out&amp;quot;, &amp;quot;w&amp;quot;) as output_file:&lt;br /&gt;
        for num in num_list:&lt;br /&gt;
            output_file.write(str(divisors[num]) + &amp;quot;\n&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
            &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Explicatie==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;is_valid(n, nums)&#039;&#039;&#039;: Această funcție primește doi parametri, n și nums. Verifică dacă numărul de elemente din lista nums este cel puțin 1 și cel mult 1.000.000 și dacă fiecare element din listă este mai mare decât 0 și mai mic decât 500.000.000. În cazul în care aceste condiții sunt îndeplinite, funcția returnează True, în caz contrar returnează False.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;calculate_divisors()&#039;&#039;&#039;: Această funcție calculează șirul de divizori pentru primele 2017 numere naturale care au exact 2017 divizori. &lt;br /&gt;
&lt;br /&gt;
Folosește două liste, &#039;&#039;&#039;b&#039;&#039;&#039; și &#039;&#039;&#039;p&#039;&#039;&#039;, pentru a marca numerele prime și numerele prime anterioare din șirul de divizori. După ce lista &#039;&#039;&#039;p&#039;&#039;&#039; este completată cu primele 2017 numere prime, funcția calculează divizorii pentru fiecare număr prim, înmulțindu-l cu el însuși, apoi cu fiecare număr prim anterioară din șir, până când ajunge la &#039;&#039;&#039;500.000.000&#039;&#039;&#039;. &lt;br /&gt;
&lt;br /&gt;
Rezultatul este returnat sub formă de listă, unde fiecare element are valoarea 1 dacă se află în șirul de divizori, sau 0 altfel.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;main()&#039;&#039;&#039;: Această funcție este punctul de intrare în program. &lt;br /&gt;
&lt;br /&gt;
Verifică dacă datele de intrare sunt valide, apoi apelează funcția &#039;&#039;&#039;calculate_divisors()&#039;&#039;&#039; pentru a obține șirul de divizori. Rezultatul este scris în fișierul &#039;&#039;&#039;douamii17.out&#039;&#039;&#039; și afișat pe ecran.&lt;/div&gt;</summary>
		<author><name>Sovago Rares-Andrei</name></author>
	</entry>
	<entry>
		<id>https://wiki.universitas.ro/index.php?title=1902_-_DouaMii17&amp;diff=5485</id>
		<title>1902 - DouaMii17</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=1902_-_DouaMii17&amp;diff=5485"/>
		<updated>2023-04-29T15:51:05Z</updated>

		<summary type="html">&lt;p&gt;Sovago Rares-Andrei: /* Restricţii şi precizări */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Cerința==&lt;br /&gt;
&lt;br /&gt;
Primele 2017 numere naturale, având fiecare exact 2017 divizori naturali, s-au gândit la început de nou an să-şi pună divizorii împreună, în ordine crescătoare, astfel se vor amesteca şi vor mai socializa şi ei în mod democratic. Marele conducător KWI s-a gândit să bage zâzanie între ei şi a început să le pună n întrebări de genul “-Domnule x, faci cumva parte din societatea secretă a divizorilor celor 2017 numere cu câte 2017 divizori?”. Să sperăm că până în anul 2017 va primi toate răspunsurile şi toată lumea va fi fericită.&lt;br /&gt;
== Date de intrare ==&lt;br /&gt;
&lt;br /&gt;
Fișierul de intrare &#039;&#039;&#039;douamii17.in&#039;&#039;&#039; conține pe prima linie numărul n, iar pe a doua linie n numere naturale separate prin spații, pentru care trebuie să verificăm dacă se află în şirul divizorilor primelor 2017 numere naturale care au exact 2017 divizori fiecare.&lt;br /&gt;
&lt;br /&gt;
== Date de ieșire ==&lt;br /&gt;
&lt;br /&gt;
Dacă datele sunt introduse corect, pe ecran se va afișa: &amp;quot;Datele sunt introduse corect.&amp;quot; Fișierul de ieșire &#039;&#039;&#039;douamii17.out&#039;&#039;&#039; va conține pe linia i, pentru fiecare i de la 1 la n, 1 dacă al i-lea număr de pe linia a doua a fişierului de intrare se află în şirul divizorilor şi 0 altfel.&lt;br /&gt;
&lt;br /&gt;
În cazul în care datele nu respectă restricțiile, se va afișa: &amp;quot;Datele nu corespund restricțiilor impuse.&amp;quot;.&lt;br /&gt;
== Restricţii şi precizări ==&lt;br /&gt;
*1 ≤ n ≤ 1.000.000&lt;br /&gt;
*numerele de pe a doua linie a fișierului de intrare vor fi mai mici decât &#039;&#039;&#039;500.000.000&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
== Exemple ==&lt;br /&gt;
===Exemplul 1===&lt;br /&gt;
; &#039;&#039;douamii17.in&#039;&#039;&lt;br /&gt;
:5&lt;br /&gt;
:1 2 18 23 9&lt;br /&gt;
; &#039;&#039;ecran&#039;&#039;&lt;br /&gt;
:Datele sunt introduse corect.&lt;br /&gt;
; &#039;&#039;douamii17.out&#039;&#039;&lt;br /&gt;
:1&lt;br /&gt;
:1&lt;br /&gt;
:0&lt;br /&gt;
:1&lt;br /&gt;
:1&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Exemplul 2===&lt;br /&gt;
; &#039;&#039;douamii17.in&#039;&#039;&lt;br /&gt;
:5&lt;br /&gt;
:10 20 30 40 50&lt;br /&gt;
; &#039;&#039;ecran&#039;&#039;&lt;br /&gt;
:Datele sunt introduse corect.&lt;br /&gt;
; &#039;&#039;douamii17.out&#039;&#039;&lt;br /&gt;
:0&lt;br /&gt;
:0&lt;br /&gt;
:0&lt;br /&gt;
:0&lt;br /&gt;
:0&lt;br /&gt;
&lt;br /&gt;
===Exemplul 3===&lt;br /&gt;
; &#039;&#039;douamii17.in&#039;&#039;&lt;br /&gt;
:3&lt;br /&gt;
:-5 1000000000 2000000000&lt;br /&gt;
; &#039;&#039;ecran&#039;&#039;&lt;br /&gt;
:Datele nu corespund restricțiilor impuse.&lt;br /&gt;
; &#039;&#039;douamii17.out&#039;&#039;&lt;br /&gt;
:&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Rezolvare == &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
# 1902 - DouaMii17&lt;br /&gt;
import math&lt;br /&gt;
&lt;br /&gt;
def is_valid(num_count, num_list):&lt;br /&gt;
    if num_count &amp;lt; 1 or num_count &amp;gt; 1000000:&lt;br /&gt;
        return False&lt;br /&gt;
    for num in num_list:&lt;br /&gt;
        if num &amp;lt; 1 or num &amp;gt;= 500000000:&lt;br /&gt;
            return False&lt;br /&gt;
    return True&lt;br /&gt;
&lt;br /&gt;
def calculate_divisors():&lt;br /&gt;
    prime_flags = [0] * 20001&lt;br /&gt;
    prime_list = []&lt;br /&gt;
    divisor_flags = [0] * (500000001)&lt;br /&gt;
    prime_count = 0&lt;br /&gt;
    current_num = 2&lt;br /&gt;
    while prime_count &amp;lt; 2017:&lt;br /&gt;
        if prime_flags[current_num] == 0:&lt;br /&gt;
            prime_count += 1&lt;br /&gt;
            prime_list.append(current_num)&lt;br /&gt;
            current_square = current_num * current_num&lt;br /&gt;
            while current_square &amp;lt; 20000:&lt;br /&gt;
                prime_flags[current_square] = 1&lt;br /&gt;
                current_square += current_num&lt;br /&gt;
        current_num += 1&lt;br /&gt;
&lt;br /&gt;
    divisor_flags[1] = 1&lt;br /&gt;
    for i in range(2017):&lt;br /&gt;
        current_prime = prime_list[i]&lt;br /&gt;
        while current_prime &amp;lt; 500000000:&lt;br /&gt;
            divisor_flags[current_prime] = 1&lt;br /&gt;
            current_prime *= prime_list[i]&lt;br /&gt;
&lt;br /&gt;
    return divisor_flags&lt;br /&gt;
&lt;br /&gt;
if __name__ == &amp;quot;__main__&amp;quot;:&lt;br /&gt;
    with open(&amp;quot;douamii17.in&amp;quot;) as input_file:&lt;br /&gt;
        num_count = int(input_file.readline().strip())&lt;br /&gt;
        num_list = list(map(int, input_file.readline().strip().split()))&lt;br /&gt;
        if not is_valid(num_count, num_list):&lt;br /&gt;
            print(&amp;quot;The data does not meet the required restrictions.&amp;quot;)&lt;br /&gt;
            exit(0)&lt;br /&gt;
&lt;br /&gt;
    divisors = calculate_divisors()&lt;br /&gt;
&lt;br /&gt;
    print(&amp;quot;The input data is correct.&amp;quot;)&lt;br /&gt;
    with open(&amp;quot;douamii17.out&amp;quot;, &amp;quot;w&amp;quot;) as output_file:&lt;br /&gt;
        for num in num_list:&lt;br /&gt;
            output_file.write(str(divisors[num]) + &amp;quot;\n&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
            &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Explicatie==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;is_valid(n, nums)&#039;&#039;&#039;: Această funcție primește doi parametri, n și nums. Verifică dacă numărul de elemente din lista nums este cel puțin 1 și cel mult 1.000.000 și dacă fiecare element din listă este mai mare decât 0 și mai mic decât 500.000.000. În cazul în care aceste condiții sunt îndeplinite, funcția returnează True, în caz contrar returnează False.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;calculate_divisors()&#039;&#039;&#039;: Această funcție calculează șirul de divizori pentru primele 2017 numere naturale care au exact 2017 divizori. &lt;br /&gt;
&lt;br /&gt;
Folosește două liste, b și p, pentru a marca numerele prime și numerele prime anterioare din șirul de divizori. După ce lista p este completată cu primele 2017 numere prime, funcția calculează divizorii pentru fiecare număr prim, înmulțindu-l cu el însuși, apoi cu fiecare număr prim anterioară din șir, până când ajunge la 500.000.000. &lt;br /&gt;
&lt;br /&gt;
Rezultatul este returnat sub formă de listă, unde fiecare element are valoarea 1 dacă se află în șirul de divizori, sau 0 altfel.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;main()&#039;&#039;&#039;: Această funcție este punctul de intrare în program. &lt;br /&gt;
&lt;br /&gt;
Verifică dacă datele de intrare sunt valide, apoi apelează funcția &#039;&#039;&#039;calculate_divisors()&#039;&#039;&#039; pentru a obține șirul de divizori. Rezultatul este scris în fișierul &#039;&#039;&#039;douamii17.out&#039;&#039;&#039; și afișat pe ecran.&lt;/div&gt;</summary>
		<author><name>Sovago Rares-Andrei</name></author>
	</entry>
	<entry>
		<id>https://wiki.universitas.ro/index.php?title=0985_-_cifre11&amp;diff=5484</id>
		<title>0985 - cifre11</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=0985_-_cifre11&amp;diff=5484"/>
		<updated>2023-04-29T15:50:07Z</updated>

		<summary type="html">&lt;p&gt;Sovago Rares-Andrei: /* Restricţii şi precizări */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Cerința==&lt;br /&gt;
&lt;br /&gt;
Se dau &#039;&#039;&#039;n&#039;&#039;&#039; numere naturale. Se cer următoarele:&lt;br /&gt;
&lt;br /&gt;
a) Determinați cel mai mare dintre numerele date care are suma cifrelor minimă.&lt;br /&gt;
&lt;br /&gt;
b) Aflați cel mai mic număr dintre numerele date care are în scrierea sa un număr maxim de cifre consecutive (de exemplu 25613 are în scrierea sa un număr maxim de 3 cifre consecutive:1,2,3).&lt;br /&gt;
&lt;br /&gt;
c) Aflați cifra comună cât mai multor numere din șir. Dacă sunt mai multe asemenea cifre se vor afișa toate în ordine crescătoare.&lt;br /&gt;
&lt;br /&gt;
== Date de intrare ==&lt;br /&gt;
&lt;br /&gt;
Fișierul de intrare &#039;&#039;&#039;cifre11.in&#039;&#039;&#039; conține pe prima linie numărul n, iar pe a doua linie n numere naturale separate prin spații.&lt;br /&gt;
&lt;br /&gt;
== Date de ieșire ==&lt;br /&gt;
&lt;br /&gt;
Dacă datele sunt introduse corect, pe ecran se va afișa: &amp;quot;Datele sunt introduse corect.&amp;quot; Fișierul de ieșire &#039;&#039;&#039;cifre11.out&#039;&#039;&#039; va conține pe prima linie cel mai mare număr din șir cu suma cifrelor minimă, pe a doua linie cel mai mic număr cu număr maxim de cifre consecutive în scrierea sa, iar pe a treia linie cifrele ce apar în scrierea a cât mai multor numere din șir, separate prin spațiu .&lt;br /&gt;
&lt;br /&gt;
În cazul în care datele nu respectă restricțiile, se va afișa: &amp;quot;Datele nu corespund restricțiilor impuse.&amp;quot;.&lt;br /&gt;
== Restricţii şi precizări ==&lt;br /&gt;
*1 ≤ n ≤ 10000&lt;br /&gt;
*numerele de pe a doua linie a fișierului de intrare vor fi mai mici decât &#039;&#039;&#039;2.000.000.000&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
== Exemple ==&lt;br /&gt;
===Exemplul 1===&lt;br /&gt;
; &#039;&#039;cifre11.in&#039;&#039;&lt;br /&gt;
:5&lt;br /&gt;
:23 1047 531 100013 8729&lt;br /&gt;
; &#039;&#039;ecran&#039;&#039;&lt;br /&gt;
:Datele sunt introduse corect.&lt;br /&gt;
; &#039;&#039;cifre11.out&#039;&#039;&lt;br /&gt;
:100013&lt;br /&gt;
:8279&lt;br /&gt;
:1 &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Exemplul 2===&lt;br /&gt;
; &#039;&#039;cifre11.in&#039;&#039;&lt;br /&gt;
:4&lt;br /&gt;
:42 17 86 90&lt;br /&gt;
; &#039;&#039;ecran&#039;&#039;&lt;br /&gt;
:Datele sunt introduse corect.&lt;br /&gt;
; &#039;&#039;cifre11.out&#039;&#039;&lt;br /&gt;
:42&lt;br /&gt;
:17&lt;br /&gt;
:1 2 4 6 7 8 9&lt;br /&gt;
===Exemplul 3===&lt;br /&gt;
; &#039;&#039;cifre11.in&#039;&#039;&lt;br /&gt;
:5&lt;br /&gt;
:1 2 3 4 &lt;br /&gt;
; &#039;&#039;ecran&#039;&#039;&lt;br /&gt;
:Datele nu corespund restricțiilor impuse.&lt;br /&gt;
; &#039;&#039;cifre11.out&#039;&#039;&lt;br /&gt;
:&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Rezolvare == &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
# 0985 - cifre11&lt;br /&gt;
# Funcția de validare: verifică dacă numărul citit este valid&lt;br /&gt;
def validare(nr):&lt;br /&gt;
    # Numărul trebuie să aibă cel puțin două cifre&lt;br /&gt;
    if nr &amp;lt; 10:&lt;br /&gt;
        return False&lt;br /&gt;
&lt;br /&gt;
    # Suma cifrelor trebuie să fie impară&lt;br /&gt;
    s = 0&lt;br /&gt;
    while nr &amp;gt; 0:&lt;br /&gt;
        s += nr % 10&lt;br /&gt;
        nr //= 10&lt;br /&gt;
    if s % 2 == 0:&lt;br /&gt;
        return False&lt;br /&gt;
&lt;br /&gt;
    return True&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
# Funcția pentru cerința a)&lt;br /&gt;
def suma_cif_min(nums):&lt;br /&gt;
    min_sum = float(&#039;inf&#039;)&lt;br /&gt;
    max_nr = -1&lt;br /&gt;
    for nr in nums:&lt;br /&gt;
        s = sum(int(c) for c in str(nr))&lt;br /&gt;
        if s &amp;lt; min_sum:&lt;br /&gt;
            min_sum = s&lt;br /&gt;
            max_nr = nr&lt;br /&gt;
        elif s == min_sum and nr &amp;gt; max_nr:&lt;br /&gt;
            max_nr = nr&lt;br /&gt;
    return max_nr&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
# Funcția pentru cerința b)&lt;br /&gt;
def cifre_consecutive(nums):&lt;br /&gt;
    max_nr = float(&#039;inf&#039;)&lt;br /&gt;
    max_ct = -1&lt;br /&gt;
    for nr in nums:&lt;br /&gt;
        str_nr = str(nr)&lt;br /&gt;
        ct = 1&lt;br /&gt;
        for i in range(1, len(str_nr)):&lt;br /&gt;
            if int(str_nr[i]) == int(str_nr[i - 1]) + 1:&lt;br /&gt;
                ct += 1&lt;br /&gt;
            else:&lt;br /&gt;
                ct = 1&lt;br /&gt;
            if ct &amp;gt; max_ct:&lt;br /&gt;
                max_ct = ct&lt;br /&gt;
                max_nr = nr&lt;br /&gt;
            elif ct == max_ct and nr &amp;lt; max_nr:&lt;br /&gt;
                max_nr = nr&lt;br /&gt;
    return max_nr&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
# Funcția pentru cerința c)&lt;br /&gt;
def cifra_comuna(nums):&lt;br /&gt;
    freq = [0] * 10&lt;br /&gt;
    for nr in nums:&lt;br /&gt;
        for c in str(nr):&lt;br /&gt;
            freq[int(c)] += 1&lt;br /&gt;
    max_freq = max(freq)&lt;br /&gt;
    cifre = []&lt;br /&gt;
    for i in range(1, 10):&lt;br /&gt;
        if freq[i] == max_freq:&lt;br /&gt;
            cifre.append(i)&lt;br /&gt;
    return cifre&lt;br /&gt;
&lt;br /&gt;
# Funcția main: citește datele de intrare și apelează funcțiile corespunzătoare&lt;br /&gt;
if __name__ == &amp;quot;__main__&amp;quot;:&lt;br /&gt;
    try:&lt;br /&gt;
        # Citire date din fisierul de intrare&lt;br /&gt;
        with open(&amp;quot;cifre11.in&amp;quot;, &amp;quot;r&amp;quot;) as fin:&lt;br /&gt;
            n = int(fin.readline().strip())&lt;br /&gt;
            nums = list(map(int, fin.readline().strip().split()))&lt;br /&gt;
            for i in range(n):&lt;br /&gt;
                line = fin.readline().strip()&lt;br /&gt;
                nums += list(map(int, line.split()))&lt;br /&gt;
&lt;br /&gt;
        # Verificare validitate date de intrare&lt;br /&gt;
        if len(nums) &amp;lt; n:&lt;br /&gt;
            raise ValueError(&amp;quot;Datele nu corespund restricțiilor impuse.&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
        # Afișare mesaj pentru date de intrare valide&lt;br /&gt;
        print(&amp;quot;Datele sunt introduse corect.&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
        # Rezolvare cerințe&lt;br /&gt;
        rez_cerinta_a = suma_cif_min(nums)&lt;br /&gt;
        rez_cerinta_b = cifre_consecutive(nums)&lt;br /&gt;
        rez_cerinta_c = cifra_comuna(nums)&lt;br /&gt;
&lt;br /&gt;
        # Scriere rezultate in fisierul de iesire&lt;br /&gt;
        with open(&amp;quot;cifre11.out&amp;quot;, &amp;quot;w&amp;quot;) as fout:&lt;br /&gt;
            fout.write(str(rez_cerinta_a) + &amp;quot;\n&amp;quot;)&lt;br /&gt;
            fout.write(str(rez_cerinta_b) + &amp;quot;\n&amp;quot;)&lt;br /&gt;
            fout.write(&amp;quot; &amp;quot;.join(str(c) for c in rez_cerinta_c))&lt;br /&gt;
&lt;br /&gt;
    except Exception as e:&lt;br /&gt;
        print(&amp;quot;Eroare:&amp;quot;, str(e))&lt;br /&gt;
&lt;br /&gt;
            &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Explicatie==&lt;br /&gt;
&lt;br /&gt;
suma_cif_min(nums): Această funcție primește o listă de numere și returnează cel mai mare dintre aceste numere care are suma cifrelor minimă. Pentru fiecare număr din listă, funcția calculează suma cifrelor și compară cu suma cifrelor minimă până în prezent. Dacă suma cifrelor curente este mai mică decât suma cifrelor minimă până în prezent, atunci acel număr devine candidat pentru soluția finală. Dacă două numere au aceeași sumă a cifrelor minime, se alege cel mai mare dintre ele.&lt;br /&gt;
&lt;br /&gt;
cifre_consecutive(nums): Această funcție primește o listă de numere și returnează cel mai mic număr dintre aceste numere care are în scrierea sa un număr maxim de cifre consecutive. Pentru fiecare număr din listă, funcția transformă numărul într-un șir de caractere și verifică câte cifre consecutive există în șir. Dacă numărul curent are mai multe cifre consecutive decât numărul maxim până în prezent, atunci acel număr devine candidat pentru soluția finală. Dacă două numere au același număr maxim de cifre consecutive, se alege cel mai mic dintre ele.&lt;br /&gt;
&lt;br /&gt;
cifra_comuna(nums): Această funcție primește o listă de numere și returnează cifra (sau cifrele) care apare cel mai des în toate numerele din listă. Pentru a face acest lucru, funcția construiește un vector de frecvență pentru fiecare cifră, apoi găsește frecvența maximă și returnează cifra sau cifrele care au această frecvență maximă.&lt;br /&gt;
&lt;br /&gt;
main(): Această funcție citeste datele de intrare din fișier, verifică dacă datele respectă restricțiile impuse și afișează un mesaj corespunzător, apelează funcțiile suma_cif_min, cifre_consecutive și cifra_comuna pentru a rezolva cerințele problemei, și scrie rezultatele în fișierul de ieșire.&lt;/div&gt;</summary>
		<author><name>Sovago Rares-Andrei</name></author>
	</entry>
	<entry>
		<id>https://wiki.universitas.ro/index.php?title=0985_-_cifre11&amp;diff=5483</id>
		<title>0985 - cifre11</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=0985_-_cifre11&amp;diff=5483"/>
		<updated>2023-04-29T15:49:27Z</updated>

		<summary type="html">&lt;p&gt;Sovago Rares-Andrei: /* Cerința */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Cerința==&lt;br /&gt;
&lt;br /&gt;
Se dau &#039;&#039;&#039;n&#039;&#039;&#039; numere naturale. Se cer următoarele:&lt;br /&gt;
&lt;br /&gt;
a) Determinați cel mai mare dintre numerele date care are suma cifrelor minimă.&lt;br /&gt;
&lt;br /&gt;
b) Aflați cel mai mic număr dintre numerele date care are în scrierea sa un număr maxim de cifre consecutive (de exemplu 25613 are în scrierea sa un număr maxim de 3 cifre consecutive:1,2,3).&lt;br /&gt;
&lt;br /&gt;
c) Aflați cifra comună cât mai multor numere din șir. Dacă sunt mai multe asemenea cifre se vor afișa toate în ordine crescătoare.&lt;br /&gt;
&lt;br /&gt;
== Date de intrare ==&lt;br /&gt;
&lt;br /&gt;
Fișierul de intrare &#039;&#039;&#039;cifre11.in&#039;&#039;&#039; conține pe prima linie numărul n, iar pe a doua linie n numere naturale separate prin spații.&lt;br /&gt;
&lt;br /&gt;
== Date de ieșire ==&lt;br /&gt;
&lt;br /&gt;
Dacă datele sunt introduse corect, pe ecran se va afișa: &amp;quot;Datele sunt introduse corect.&amp;quot; Fișierul de ieșire &#039;&#039;&#039;cifre11.out&#039;&#039;&#039; va conține pe prima linie cel mai mare număr din șir cu suma cifrelor minimă, pe a doua linie cel mai mic număr cu număr maxim de cifre consecutive în scrierea sa, iar pe a treia linie cifrele ce apar în scrierea a cât mai multor numere din șir, separate prin spațiu .&lt;br /&gt;
&lt;br /&gt;
În cazul în care datele nu respectă restricțiile, se va afișa: &amp;quot;Datele nu corespund restricțiilor impuse.&amp;quot;.&lt;br /&gt;
== Restricţii şi precizări ==&lt;br /&gt;
*1 ≤ n ≤ 10000&lt;br /&gt;
*numerele de pe a doua linie a fișierului de intrare vor fi mai mici decât 2.000.000.000&lt;br /&gt;
&lt;br /&gt;
== Exemple ==&lt;br /&gt;
===Exemplul 1===&lt;br /&gt;
; &#039;&#039;cifre11.in&#039;&#039;&lt;br /&gt;
:5&lt;br /&gt;
:23 1047 531 100013 8729&lt;br /&gt;
; &#039;&#039;ecran&#039;&#039;&lt;br /&gt;
:Datele sunt introduse corect.&lt;br /&gt;
; &#039;&#039;cifre11.out&#039;&#039;&lt;br /&gt;
:100013&lt;br /&gt;
:8279&lt;br /&gt;
:1 &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Exemplul 2===&lt;br /&gt;
; &#039;&#039;cifre11.in&#039;&#039;&lt;br /&gt;
:4&lt;br /&gt;
:42 17 86 90&lt;br /&gt;
; &#039;&#039;ecran&#039;&#039;&lt;br /&gt;
:Datele sunt introduse corect.&lt;br /&gt;
; &#039;&#039;cifre11.out&#039;&#039;&lt;br /&gt;
:42&lt;br /&gt;
:17&lt;br /&gt;
:1 2 4 6 7 8 9&lt;br /&gt;
===Exemplul 3===&lt;br /&gt;
; &#039;&#039;cifre11.in&#039;&#039;&lt;br /&gt;
:5&lt;br /&gt;
:1 2 3 4 &lt;br /&gt;
; &#039;&#039;ecran&#039;&#039;&lt;br /&gt;
:Datele nu corespund restricțiilor impuse.&lt;br /&gt;
; &#039;&#039;cifre11.out&#039;&#039;&lt;br /&gt;
:&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Rezolvare == &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
# 0985 - cifre11&lt;br /&gt;
# Funcția de validare: verifică dacă numărul citit este valid&lt;br /&gt;
def validare(nr):&lt;br /&gt;
    # Numărul trebuie să aibă cel puțin două cifre&lt;br /&gt;
    if nr &amp;lt; 10:&lt;br /&gt;
        return False&lt;br /&gt;
&lt;br /&gt;
    # Suma cifrelor trebuie să fie impară&lt;br /&gt;
    s = 0&lt;br /&gt;
    while nr &amp;gt; 0:&lt;br /&gt;
        s += nr % 10&lt;br /&gt;
        nr //= 10&lt;br /&gt;
    if s % 2 == 0:&lt;br /&gt;
        return False&lt;br /&gt;
&lt;br /&gt;
    return True&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
# Funcția pentru cerința a)&lt;br /&gt;
def suma_cif_min(nums):&lt;br /&gt;
    min_sum = float(&#039;inf&#039;)&lt;br /&gt;
    max_nr = -1&lt;br /&gt;
    for nr in nums:&lt;br /&gt;
        s = sum(int(c) for c in str(nr))&lt;br /&gt;
        if s &amp;lt; min_sum:&lt;br /&gt;
            min_sum = s&lt;br /&gt;
            max_nr = nr&lt;br /&gt;
        elif s == min_sum and nr &amp;gt; max_nr:&lt;br /&gt;
            max_nr = nr&lt;br /&gt;
    return max_nr&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
# Funcția pentru cerința b)&lt;br /&gt;
def cifre_consecutive(nums):&lt;br /&gt;
    max_nr = float(&#039;inf&#039;)&lt;br /&gt;
    max_ct = -1&lt;br /&gt;
    for nr in nums:&lt;br /&gt;
        str_nr = str(nr)&lt;br /&gt;
        ct = 1&lt;br /&gt;
        for i in range(1, len(str_nr)):&lt;br /&gt;
            if int(str_nr[i]) == int(str_nr[i - 1]) + 1:&lt;br /&gt;
                ct += 1&lt;br /&gt;
            else:&lt;br /&gt;
                ct = 1&lt;br /&gt;
            if ct &amp;gt; max_ct:&lt;br /&gt;
                max_ct = ct&lt;br /&gt;
                max_nr = nr&lt;br /&gt;
            elif ct == max_ct and nr &amp;lt; max_nr:&lt;br /&gt;
                max_nr = nr&lt;br /&gt;
    return max_nr&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
# Funcția pentru cerința c)&lt;br /&gt;
def cifra_comuna(nums):&lt;br /&gt;
    freq = [0] * 10&lt;br /&gt;
    for nr in nums:&lt;br /&gt;
        for c in str(nr):&lt;br /&gt;
            freq[int(c)] += 1&lt;br /&gt;
    max_freq = max(freq)&lt;br /&gt;
    cifre = []&lt;br /&gt;
    for i in range(1, 10):&lt;br /&gt;
        if freq[i] == max_freq:&lt;br /&gt;
            cifre.append(i)&lt;br /&gt;
    return cifre&lt;br /&gt;
&lt;br /&gt;
# Funcția main: citește datele de intrare și apelează funcțiile corespunzătoare&lt;br /&gt;
if __name__ == &amp;quot;__main__&amp;quot;:&lt;br /&gt;
    try:&lt;br /&gt;
        # Citire date din fisierul de intrare&lt;br /&gt;
        with open(&amp;quot;cifre11.in&amp;quot;, &amp;quot;r&amp;quot;) as fin:&lt;br /&gt;
            n = int(fin.readline().strip())&lt;br /&gt;
            nums = list(map(int, fin.readline().strip().split()))&lt;br /&gt;
            for i in range(n):&lt;br /&gt;
                line = fin.readline().strip()&lt;br /&gt;
                nums += list(map(int, line.split()))&lt;br /&gt;
&lt;br /&gt;
        # Verificare validitate date de intrare&lt;br /&gt;
        if len(nums) &amp;lt; n:&lt;br /&gt;
            raise ValueError(&amp;quot;Datele nu corespund restricțiilor impuse.&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
        # Afișare mesaj pentru date de intrare valide&lt;br /&gt;
        print(&amp;quot;Datele sunt introduse corect.&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
        # Rezolvare cerințe&lt;br /&gt;
        rez_cerinta_a = suma_cif_min(nums)&lt;br /&gt;
        rez_cerinta_b = cifre_consecutive(nums)&lt;br /&gt;
        rez_cerinta_c = cifra_comuna(nums)&lt;br /&gt;
&lt;br /&gt;
        # Scriere rezultate in fisierul de iesire&lt;br /&gt;
        with open(&amp;quot;cifre11.out&amp;quot;, &amp;quot;w&amp;quot;) as fout:&lt;br /&gt;
            fout.write(str(rez_cerinta_a) + &amp;quot;\n&amp;quot;)&lt;br /&gt;
            fout.write(str(rez_cerinta_b) + &amp;quot;\n&amp;quot;)&lt;br /&gt;
            fout.write(&amp;quot; &amp;quot;.join(str(c) for c in rez_cerinta_c))&lt;br /&gt;
&lt;br /&gt;
    except Exception as e:&lt;br /&gt;
        print(&amp;quot;Eroare:&amp;quot;, str(e))&lt;br /&gt;
&lt;br /&gt;
            &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Explicatie==&lt;br /&gt;
&lt;br /&gt;
suma_cif_min(nums): Această funcție primește o listă de numere și returnează cel mai mare dintre aceste numere care are suma cifrelor minimă. Pentru fiecare număr din listă, funcția calculează suma cifrelor și compară cu suma cifrelor minimă până în prezent. Dacă suma cifrelor curente este mai mică decât suma cifrelor minimă până în prezent, atunci acel număr devine candidat pentru soluția finală. Dacă două numere au aceeași sumă a cifrelor minime, se alege cel mai mare dintre ele.&lt;br /&gt;
&lt;br /&gt;
cifre_consecutive(nums): Această funcție primește o listă de numere și returnează cel mai mic număr dintre aceste numere care are în scrierea sa un număr maxim de cifre consecutive. Pentru fiecare număr din listă, funcția transformă numărul într-un șir de caractere și verifică câte cifre consecutive există în șir. Dacă numărul curent are mai multe cifre consecutive decât numărul maxim până în prezent, atunci acel număr devine candidat pentru soluția finală. Dacă două numere au același număr maxim de cifre consecutive, se alege cel mai mic dintre ele.&lt;br /&gt;
&lt;br /&gt;
cifra_comuna(nums): Această funcție primește o listă de numere și returnează cifra (sau cifrele) care apare cel mai des în toate numerele din listă. Pentru a face acest lucru, funcția construiește un vector de frecvență pentru fiecare cifră, apoi găsește frecvența maximă și returnează cifra sau cifrele care au această frecvență maximă.&lt;br /&gt;
&lt;br /&gt;
main(): Această funcție citeste datele de intrare din fișier, verifică dacă datele respectă restricțiile impuse și afișează un mesaj corespunzător, apelează funcțiile suma_cif_min, cifre_consecutive și cifra_comuna pentru a rezolva cerințele problemei, și scrie rezultatele în fișierul de ieșire.&lt;/div&gt;</summary>
		<author><name>Sovago Rares-Andrei</name></author>
	</entry>
	<entry>
		<id>https://wiki.universitas.ro/index.php?title=2414_-_2lap&amp;diff=5482</id>
		<title>2414 - 2lap</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=2414_-_2lap&amp;diff=5482"/>
		<updated>2023-04-29T15:48:27Z</updated>

		<summary type="html">&lt;p&gt;Sovago Rares-Andrei: /* Date de intrare */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Cerința==&lt;br /&gt;
&lt;br /&gt;
Se citesc două numere naturale &#039;&#039;&#039;N&#039;&#039;&#039; și &#039;&#039;&#039;M&#039;&#039;&#039; și apoi, de pe următoarea linie, numere naturale de forma 2p, separate prin câte un spațiu. Să se afișeze:&lt;br /&gt;
1. care sunt valorile ce ar apărea pe pozițiile N și M în șirul ordonat crescător obținut din toate numerele aflate pe a doua linie a fișierului, separate printr-un spațiu;&lt;br /&gt;
2. puterea la care apare 2 în descompunerea în factori primi a produsului tuturor numerelor care ar fi situate între pozițiile N și M (exclusiv acestea) în șirul ordonat crescător obținut din toate numerele aflate pe a doua linie a fișierului de intrare;&lt;br /&gt;
3. toate numerele distincte, afișate în ordine crescătoare, care ar apărea între pozițiile N și M (exclusiv acestea) în șirul ordonat crescător, obținut din valorile citite de pe a doua linie a fișierului de intrare.&lt;br /&gt;
&lt;br /&gt;
== Date de intrare ==&lt;br /&gt;
&lt;br /&gt;
Fișierul de intrare &#039;&#039;&#039;2lap.in&#039;&#039;&#039; conține pe prima linie numărul N și M despărțite printr-un spațiu, iar pe a doua linie numere naturale de forma &#039;&#039;&#039;2^p&#039;&#039;&#039;, separate de asemenea prin spații.&lt;br /&gt;
&lt;br /&gt;
== Date de ieșire ==&lt;br /&gt;
&lt;br /&gt;
Dacă datele sunt introduse corect, pe ecran se va afișa: &amp;quot;Datele sunt introduse corect.&amp;quot; Fișierul de ieșire &#039;&#039;&#039;2lap.out&#039;&#039;&#039; va conține pe prima linie numerele K1 și K2 reprezentând numerele care ar apărea pe pozițiile N, respectiv M în șirul ordonat crescător obținut din toate numerele aflate pe a doua linie a fișierului de intrare, separate printr-un spațiu, pe a doua linie a fișierului un singur număr K reprezentând puterea la care apare 2 în descompunerea în factori primi a produsului cerut, iar pe a treia linie a fișierului de ieșire, valorile cerute, de asemenea separate printr-un spațiu.&lt;br /&gt;
&lt;br /&gt;
În cazul în care datele nu respectă restricțiile, se va afișa: &amp;quot;Datele nu corespund restricțiilor impuse.&amp;quot;.&lt;br /&gt;
== Restricţii şi precizări ==&lt;br /&gt;
*1 ≤ N &amp;lt; M ≤ 30000&lt;br /&gt;
*0 ≤ p ≤ 30&lt;br /&gt;
*șirul nu are mai puțin de M termeni&lt;br /&gt;
*N + 1 &amp;lt; M&lt;br /&gt;
&lt;br /&gt;
== Exemple ==&lt;br /&gt;
===Exemplul 1===&lt;br /&gt;
; &#039;&#039;2lap.in&#039;&#039;&lt;br /&gt;
:5 8&lt;br /&gt;
:16 32 2 64 256 128 32 128 32 128 &lt;br /&gt;
; &#039;&#039;ecran&#039;&#039;&lt;br /&gt;
:Datele sunt introduse corect.&lt;br /&gt;
; &#039;&#039;2lap.out&#039;&#039;&lt;br /&gt;
:32 128&lt;br /&gt;
:14&lt;br /&gt;
:64 128&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Exemplul 2===&lt;br /&gt;
; &#039;&#039;2lap.in&#039;&#039;&lt;br /&gt;
:3 7&lt;br /&gt;
:8 16 32 64 128 256 51 &lt;br /&gt;
; &#039;&#039;ecran&#039;&#039;&lt;br /&gt;
:Datele sunt introduse corect.&lt;br /&gt;
; &#039;&#039;2lap.out&#039;&#039;&lt;br /&gt;
:32 512&lt;br /&gt;
:24&lt;br /&gt;
:64 128 256 512 &lt;br /&gt;
&lt;br /&gt;
===Exemplul 3===&lt;br /&gt;
; &#039;&#039;2lap.in&#039;&#039;&lt;br /&gt;
:10 5&lt;br /&gt;
:2 4 8 16 32 64&lt;br /&gt;
; &#039;&#039;ecran&#039;&#039;&lt;br /&gt;
:Datele nu corespund restricțiilor impuse.&lt;br /&gt;
; &#039;&#039;2lap.out&#039;&#039;&lt;br /&gt;
:&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Rezolvare == &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
# 2414 - 2lap&lt;br /&gt;
def validare_date(n, m, nums):&lt;br /&gt;
    if not (1 &amp;lt;= n &amp;lt; m &amp;lt;= 30000):&lt;br /&gt;
        print(&amp;quot;Datele nu corespund restricțiilor impuse.&amp;quot;)&lt;br /&gt;
        return False&lt;br /&gt;
    for x in nums:&lt;br /&gt;
        if not (0 &amp;lt;= x &amp;lt;= 2**30 and x &amp;amp; (x-1) == 0):&lt;br /&gt;
            print(&amp;quot;Datele nu corespund restricțiilor impuse.&amp;quot;)&lt;br /&gt;
            return False&lt;br /&gt;
    print(&amp;quot;Datele sunt introduse corect.&amp;quot;)&lt;br /&gt;
    return True&lt;br /&gt;
&lt;br /&gt;
def rezolvare(n, m, nums):&lt;br /&gt;
    nums.sort()&lt;br /&gt;
    if n &amp;gt;= m or n + 1 &amp;gt; len(nums) or m &amp;gt; len(nums):&lt;br /&gt;
        return&lt;br /&gt;
    k1, k2 = nums[n-1], nums[m-1]&lt;br /&gt;
&lt;br /&gt;
    produs = 1&lt;br /&gt;
    for i in range(n + 1, m):&lt;br /&gt;
        produs *= nums[i]&lt;br /&gt;
    putere_minima = produs.bit_length()&lt;br /&gt;
&lt;br /&gt;
    nums_set = set(nums[n:m])&lt;br /&gt;
    rezultat = f&amp;quot;{k1} {k2}\n{putere_minima - 1}\n{&#039; &#039;.join(str(x) for x in sorted(nums_set))}\n&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    return rezultat&lt;br /&gt;
&lt;br /&gt;
if __name__ == &amp;quot;__main__&amp;quot;:&lt;br /&gt;
    with open(&amp;quot;2lap.in&amp;quot;, &amp;quot;r&amp;quot;) as f:&lt;br /&gt;
        n, m = map(int, f.readline().split())&lt;br /&gt;
        nums = list(map(int, f.readline().split()))&lt;br /&gt;
        if validare_date(n, m, nums):&lt;br /&gt;
            with open(&amp;quot;2lap.out&amp;quot;, &amp;quot;w&amp;quot;) as g:&lt;br /&gt;
                g.write(rezolvare(n, m, nums))&lt;br /&gt;
        else:&lt;br /&gt;
            print(&amp;quot;Nu s-au putut rezolva problemele din cauza datelor invalide.&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
            &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Explicatie==&lt;br /&gt;
&lt;br /&gt;
1. validare&lt;br /&gt;
Această funcție are rolul de a verifica dacă datele de intrare respectă restricțiile impuse de cerință. Dacă valorile introduse sunt corecte, funcția returnează True, altfel returnează False.&lt;br /&gt;
&lt;br /&gt;
Funcția începe prin a deschide fișierul de intrare 2lap.in și a citi valorile N și M de pe prima linie. Apoi, verifică dacă N și M sunt numere naturale distincte și dacă acestea respectă restricțiile impuse de cerință, adică 1 ≤ N &amp;lt; M ≤ 30000. Dacă valorile nu respectă aceste condiții, funcția returnează False. În caz contrar, funcția returnează True, semn că datele de intrare sunt valide și programul poate continua cu următoarea etapă.&lt;br /&gt;
&lt;br /&gt;
2. rezolvare&lt;br /&gt;
Această funcție primește datele de intrare (valide, după cum se presupune) și are rolul de a găsi soluția cerută și de a o scrie în fișierul de ieșire 2lap.out.&lt;br /&gt;
&lt;br /&gt;
Funcția începe prin a citi lista de numere de pe a doua linie a fișierului de intrare și a determina valorile k1 și k2 care apar pe pozițiile N și M din lista ordonată crescător a numerelor citite.&lt;br /&gt;
&lt;br /&gt;
După ce găsește valorile k1 și k2, funcția calculează puterea minimă la care apare numărul 2 în produsul numerelor de la poziția N+1 la poziția M-1 inclusiv. Aceasta se face prin calculul produsului tuturor numerelor din lista de la poziția N+1 la poziția M-1, iar apoi divizând repetat produsul la 2 până când produsul nu mai poate fi divizat. Numărul de divizări la 2 corespunde puterii la care apare numărul 2 în produs.&lt;br /&gt;
&lt;br /&gt;
În final, funcția afișează toate numerele distincte din lista inițială care se află între pozițiile N și M, excludând valorile k1 și k2. Valorile sunt sortate crescător și separate prin spații.&lt;br /&gt;
&lt;br /&gt;
3. main&lt;br /&gt;
Această funcție este punctul de intrare în program. Funcția începe prin a apela funcția validare pentru a verifica datele de intrare. Dacă datele sunt valide, funcția rezolvare este apelată pentru a găsi soluția cerută și a o scrie în fișierul de ieșire. Dacă datele nu sunt valide, programul afișează un mesaj corespunzător.&lt;/div&gt;</summary>
		<author><name>Sovago Rares-Andrei</name></author>
	</entry>
	<entry>
		<id>https://wiki.universitas.ro/index.php?title=2414_-_2lap&amp;diff=5481</id>
		<title>2414 - 2lap</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=2414_-_2lap&amp;diff=5481"/>
		<updated>2023-04-29T15:48:08Z</updated>

		<summary type="html">&lt;p&gt;Sovago Rares-Andrei: /* Cerința */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Cerința==&lt;br /&gt;
&lt;br /&gt;
Se citesc două numere naturale &#039;&#039;&#039;N&#039;&#039;&#039; și &#039;&#039;&#039;M&#039;&#039;&#039; și apoi, de pe următoarea linie, numere naturale de forma 2p, separate prin câte un spațiu. Să se afișeze:&lt;br /&gt;
1. care sunt valorile ce ar apărea pe pozițiile N și M în șirul ordonat crescător obținut din toate numerele aflate pe a doua linie a fișierului, separate printr-un spațiu;&lt;br /&gt;
2. puterea la care apare 2 în descompunerea în factori primi a produsului tuturor numerelor care ar fi situate între pozițiile N și M (exclusiv acestea) în șirul ordonat crescător obținut din toate numerele aflate pe a doua linie a fișierului de intrare;&lt;br /&gt;
3. toate numerele distincte, afișate în ordine crescătoare, care ar apărea între pozițiile N și M (exclusiv acestea) în șirul ordonat crescător, obținut din valorile citite de pe a doua linie a fișierului de intrare.&lt;br /&gt;
&lt;br /&gt;
== Date de intrare ==&lt;br /&gt;
&lt;br /&gt;
Fișierul de intrare &#039;&#039;&#039;2lap.in&#039;&#039;&#039; conține pe prima linie numărul N și M despărțite printr-un spațiu, iar pe a doua linie numere naturale de forma 2^p, separate de asemenea prin spații.&lt;br /&gt;
&lt;br /&gt;
== Date de ieșire ==&lt;br /&gt;
&lt;br /&gt;
Dacă datele sunt introduse corect, pe ecran se va afișa: &amp;quot;Datele sunt introduse corect.&amp;quot; Fișierul de ieșire &#039;&#039;&#039;2lap.out&#039;&#039;&#039; va conține pe prima linie numerele K1 și K2 reprezentând numerele care ar apărea pe pozițiile N, respectiv M în șirul ordonat crescător obținut din toate numerele aflate pe a doua linie a fișierului de intrare, separate printr-un spațiu, pe a doua linie a fișierului un singur număr K reprezentând puterea la care apare 2 în descompunerea în factori primi a produsului cerut, iar pe a treia linie a fișierului de ieșire, valorile cerute, de asemenea separate printr-un spațiu.&lt;br /&gt;
&lt;br /&gt;
În cazul în care datele nu respectă restricțiile, se va afișa: &amp;quot;Datele nu corespund restricțiilor impuse.&amp;quot;.&lt;br /&gt;
== Restricţii şi precizări ==&lt;br /&gt;
*1 ≤ N &amp;lt; M ≤ 30000&lt;br /&gt;
*0 ≤ p ≤ 30&lt;br /&gt;
*șirul nu are mai puțin de M termeni&lt;br /&gt;
*N + 1 &amp;lt; M&lt;br /&gt;
&lt;br /&gt;
== Exemple ==&lt;br /&gt;
===Exemplul 1===&lt;br /&gt;
; &#039;&#039;2lap.in&#039;&#039;&lt;br /&gt;
:5 8&lt;br /&gt;
:16 32 2 64 256 128 32 128 32 128 &lt;br /&gt;
; &#039;&#039;ecran&#039;&#039;&lt;br /&gt;
:Datele sunt introduse corect.&lt;br /&gt;
; &#039;&#039;2lap.out&#039;&#039;&lt;br /&gt;
:32 128&lt;br /&gt;
:14&lt;br /&gt;
:64 128&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Exemplul 2===&lt;br /&gt;
; &#039;&#039;2lap.in&#039;&#039;&lt;br /&gt;
:3 7&lt;br /&gt;
:8 16 32 64 128 256 51 &lt;br /&gt;
; &#039;&#039;ecran&#039;&#039;&lt;br /&gt;
:Datele sunt introduse corect.&lt;br /&gt;
; &#039;&#039;2lap.out&#039;&#039;&lt;br /&gt;
:32 512&lt;br /&gt;
:24&lt;br /&gt;
:64 128 256 512 &lt;br /&gt;
&lt;br /&gt;
===Exemplul 3===&lt;br /&gt;
; &#039;&#039;2lap.in&#039;&#039;&lt;br /&gt;
:10 5&lt;br /&gt;
:2 4 8 16 32 64&lt;br /&gt;
; &#039;&#039;ecran&#039;&#039;&lt;br /&gt;
:Datele nu corespund restricțiilor impuse.&lt;br /&gt;
; &#039;&#039;2lap.out&#039;&#039;&lt;br /&gt;
:&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Rezolvare == &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
# 2414 - 2lap&lt;br /&gt;
def validare_date(n, m, nums):&lt;br /&gt;
    if not (1 &amp;lt;= n &amp;lt; m &amp;lt;= 30000):&lt;br /&gt;
        print(&amp;quot;Datele nu corespund restricțiilor impuse.&amp;quot;)&lt;br /&gt;
        return False&lt;br /&gt;
    for x in nums:&lt;br /&gt;
        if not (0 &amp;lt;= x &amp;lt;= 2**30 and x &amp;amp; (x-1) == 0):&lt;br /&gt;
            print(&amp;quot;Datele nu corespund restricțiilor impuse.&amp;quot;)&lt;br /&gt;
            return False&lt;br /&gt;
    print(&amp;quot;Datele sunt introduse corect.&amp;quot;)&lt;br /&gt;
    return True&lt;br /&gt;
&lt;br /&gt;
def rezolvare(n, m, nums):&lt;br /&gt;
    nums.sort()&lt;br /&gt;
    if n &amp;gt;= m or n + 1 &amp;gt; len(nums) or m &amp;gt; len(nums):&lt;br /&gt;
        return&lt;br /&gt;
    k1, k2 = nums[n-1], nums[m-1]&lt;br /&gt;
&lt;br /&gt;
    produs = 1&lt;br /&gt;
    for i in range(n + 1, m):&lt;br /&gt;
        produs *= nums[i]&lt;br /&gt;
    putere_minima = produs.bit_length()&lt;br /&gt;
&lt;br /&gt;
    nums_set = set(nums[n:m])&lt;br /&gt;
    rezultat = f&amp;quot;{k1} {k2}\n{putere_minima - 1}\n{&#039; &#039;.join(str(x) for x in sorted(nums_set))}\n&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    return rezultat&lt;br /&gt;
&lt;br /&gt;
if __name__ == &amp;quot;__main__&amp;quot;:&lt;br /&gt;
    with open(&amp;quot;2lap.in&amp;quot;, &amp;quot;r&amp;quot;) as f:&lt;br /&gt;
        n, m = map(int, f.readline().split())&lt;br /&gt;
        nums = list(map(int, f.readline().split()))&lt;br /&gt;
        if validare_date(n, m, nums):&lt;br /&gt;
            with open(&amp;quot;2lap.out&amp;quot;, &amp;quot;w&amp;quot;) as g:&lt;br /&gt;
                g.write(rezolvare(n, m, nums))&lt;br /&gt;
        else:&lt;br /&gt;
            print(&amp;quot;Nu s-au putut rezolva problemele din cauza datelor invalide.&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
            &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Explicatie==&lt;br /&gt;
&lt;br /&gt;
1. validare&lt;br /&gt;
Această funcție are rolul de a verifica dacă datele de intrare respectă restricțiile impuse de cerință. Dacă valorile introduse sunt corecte, funcția returnează True, altfel returnează False.&lt;br /&gt;
&lt;br /&gt;
Funcția începe prin a deschide fișierul de intrare 2lap.in și a citi valorile N și M de pe prima linie. Apoi, verifică dacă N și M sunt numere naturale distincte și dacă acestea respectă restricțiile impuse de cerință, adică 1 ≤ N &amp;lt; M ≤ 30000. Dacă valorile nu respectă aceste condiții, funcția returnează False. În caz contrar, funcția returnează True, semn că datele de intrare sunt valide și programul poate continua cu următoarea etapă.&lt;br /&gt;
&lt;br /&gt;
2. rezolvare&lt;br /&gt;
Această funcție primește datele de intrare (valide, după cum se presupune) și are rolul de a găsi soluția cerută și de a o scrie în fișierul de ieșire 2lap.out.&lt;br /&gt;
&lt;br /&gt;
Funcția începe prin a citi lista de numere de pe a doua linie a fișierului de intrare și a determina valorile k1 și k2 care apar pe pozițiile N și M din lista ordonată crescător a numerelor citite.&lt;br /&gt;
&lt;br /&gt;
După ce găsește valorile k1 și k2, funcția calculează puterea minimă la care apare numărul 2 în produsul numerelor de la poziția N+1 la poziția M-1 inclusiv. Aceasta se face prin calculul produsului tuturor numerelor din lista de la poziția N+1 la poziția M-1, iar apoi divizând repetat produsul la 2 până când produsul nu mai poate fi divizat. Numărul de divizări la 2 corespunde puterii la care apare numărul 2 în produs.&lt;br /&gt;
&lt;br /&gt;
În final, funcția afișează toate numerele distincte din lista inițială care se află între pozițiile N și M, excludând valorile k1 și k2. Valorile sunt sortate crescător și separate prin spații.&lt;br /&gt;
&lt;br /&gt;
3. main&lt;br /&gt;
Această funcție este punctul de intrare în program. Funcția începe prin a apela funcția validare pentru a verifica datele de intrare. Dacă datele sunt valide, funcția rezolvare este apelată pentru a găsi soluția cerută și a o scrie în fișierul de ieșire. Dacă datele nu sunt valide, programul afișează un mesaj corespunzător.&lt;/div&gt;</summary>
		<author><name>Sovago Rares-Andrei</name></author>
	</entry>
	<entry>
		<id>https://wiki.universitas.ro/index.php?title=1374_-_numere9&amp;diff=5480</id>
		<title>1374 - numere9</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=1374_-_numere9&amp;diff=5480"/>
		<updated>2023-04-29T15:47:05Z</updated>

		<summary type="html">&lt;p&gt;Sovago Rares-Andrei: /* Cerința */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Cerința==&lt;br /&gt;
&lt;br /&gt;
Mircea este pasionat de programare. El a început să rezolve probleme din ce în ce mai grele. Astfel a ajuns la o problemă, care are ca date de intrare un tablou pătratic cu &#039;&#039;&#039;n&#039;&#039;&#039; linii şi &#039;&#039;&#039;n&#039;&#039;&#039; coloane, componente tabloului fiind toate numerele naturale distincte de la &#039;&#039;&#039;1 la n^2&#039;&#039;&#039;. Pentru a verifica programul pe care l-a scris îi trebuie un fişier care să conţină tabloul respectiv. După ce a creat acest fişier, fratele său, pus pe şotii îi umblă în fişier şi îi schimbă câteva numere consecutive, cu numărul 0. Când se întoarce Mircea de la joacă constată cu stupoare că nu îi merge programul pentru testul respectiv. După câteva ore de depanare îşi dă seama că programul lui este corect şi că fişierul de intrare are probleme.&lt;br /&gt;
&lt;br /&gt;
Scrieţi un program care să-l ajute pe Mircea, găsindu-i cel mai mic şi cel mai mare dintre numerele consecutive schimbate de fratele său.&lt;br /&gt;
&lt;br /&gt;
== Date de intrare ==&lt;br /&gt;
&lt;br /&gt;
În fişierul &#039;&#039;&#039;numere9.in&#039;&#039;&#039; se dă pe prima linie n, iar pe următoarele n linii elementele tabloului, câte n elemente pe o linie, separate între ele prin câte un spaţiu, după modificările făcute de fratele lui Mircea.&lt;br /&gt;
&lt;br /&gt;
== Date de ieșire ==&lt;br /&gt;
&lt;br /&gt;
Dacă datele sunt introduse corect, pe ecran se va afișa: &amp;quot;Datele sunt introduse corect.&amp;quot; În fişierul &#039;&#039;&#039;numere9.out&#039;&#039;&#039; se va scrie pe un singur rând cu un singur spaţiu între ele numerele cerute (primul fiind cel mai mic).&lt;br /&gt;
&lt;br /&gt;
În cazul în care datele nu respectă restricțiile, se va afișa: &amp;quot;Datele nu corespund restricțiilor impuse.&amp;quot;.&lt;br /&gt;
== Restricţii şi precizări ==&lt;br /&gt;
*0&amp;lt;n≤500&lt;br /&gt;
*Fratele lui Mircea schimbă cel puţin un număr în fişier.&lt;br /&gt;
*Numerele schimbate de fratele lui Mircea sunt mai mici sau cel mult egale cu &#039;&#039;&#039;60000&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
== Exemple ==&lt;br /&gt;
===Exemplul 1===&lt;br /&gt;
; &#039;&#039;numere9.in&#039;&#039;&lt;br /&gt;
:3&lt;br /&gt;
:5 0 7&lt;br /&gt;
:0 0 1&lt;br /&gt;
:6 9 8&lt;br /&gt;
; &#039;&#039;ecran&#039;&#039;&lt;br /&gt;
:Datele sunt introduse corect.&lt;br /&gt;
; &#039;&#039;numere9.out&#039;&#039;&lt;br /&gt;
:6 9&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Exemplul 2===&lt;br /&gt;
; &#039;&#039;numere9.in&#039;&#039;&lt;br /&gt;
:3&lt;br /&gt;
:2 3 1&lt;br /&gt;
:7 5 4&lt;br /&gt;
:8 0 6&lt;br /&gt;
; &#039;&#039;ecran&#039;&#039;&lt;br /&gt;
:Datele sunt introduse corect.&lt;br /&gt;
; &#039;&#039;numere9.out&#039;&#039;&lt;br /&gt;
:1 7 &lt;br /&gt;
&lt;br /&gt;
===Exemplul 3===&lt;br /&gt;
; &#039;&#039;numere9.in&#039;&#039;&lt;br /&gt;
:2&lt;br /&gt;
:4 5&lt;br /&gt;
:1&lt;br /&gt;
; &#039;&#039;ecran&#039;&#039;&lt;br /&gt;
:Datele nu corespund restricțiilor impuse.&lt;br /&gt;
; &#039;&#039;numere9.out&#039;&#039;&lt;br /&gt;
:&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Rezolvare == &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
# 1374 - numere9&lt;br /&gt;
def validate_input(n: int, matrix: list[list[int]]) -&amp;gt; bool:&lt;br /&gt;
    if not 0 &amp;lt; n &amp;lt;= 500:&lt;br /&gt;
        print(&amp;quot;Error: The size of the matrix must be between 1 and 500.&amp;quot;)&lt;br /&gt;
        return False&lt;br /&gt;
    for i in range(n):&lt;br /&gt;
        for j in range(n):&lt;br /&gt;
            if not 0 &amp;lt;= matrix[i][j] &amp;lt;= 60000:&lt;br /&gt;
                print(f&amp;quot;Error: Invalid number &#039;{matrix[i][j]}&#039; at line {i+2}, column {j+1}.&amp;quot;)&lt;br /&gt;
                return False&lt;br /&gt;
    return True&lt;br /&gt;
&lt;br /&gt;
def find_changed_numbers(n: int, matrix: list[list[int]]) -&amp;gt; tuple[int, int]:&lt;br /&gt;
    min_changed, max_changed = float(&#039;inf&#039;), float(&#039;-inf&#039;)&lt;br /&gt;
    for i in range(n):&lt;br /&gt;
        for j in range(n-1):&lt;br /&gt;
            if matrix[i][j] == 0 or matrix[i][j+1] == 0:&lt;br /&gt;
                continue&lt;br /&gt;
            elif abs(matrix[i][j+1] - matrix[i][j]) &amp;gt; 1:&lt;br /&gt;
                min_changed = min(min_changed, matrix[i][j], matrix[i][j+1])&lt;br /&gt;
                max_changed = max(max_changed, matrix[i][j], matrix[i][j+1])&lt;br /&gt;
    return (min_changed, max_changed)&lt;br /&gt;
&lt;br /&gt;
if __name__ == &#039;__main__&#039;:&lt;br /&gt;
    try:&lt;br /&gt;
        with open(&#039;numere9.in&#039;, &#039;r&#039;) as f:&lt;br /&gt;
            n = int(f.readline())&lt;br /&gt;
            matrix = []&lt;br /&gt;
            for i in range(n):&lt;br /&gt;
                row = list(map(int, f.readline().split()))&lt;br /&gt;
                if len(row) != n:&lt;br /&gt;
                    raise ValueError(&amp;quot;Datele nu corespund restricțiilor impuse.&amp;quot;)&lt;br /&gt;
                matrix.append(row)&lt;br /&gt;
            if len(matrix) != n:&lt;br /&gt;
                raise ValueError(&amp;quot;Datele nu corespund restricțiilor impuse.&amp;quot;)&lt;br /&gt;
        if validate_input(n, matrix):&lt;br /&gt;
            smallest, largest = find_changed_numbers(n, matrix)&lt;br /&gt;
            with open(&#039;numere9.out&#039;, &#039;w&#039;) as f:&lt;br /&gt;
                f.write(f&amp;quot;{smallest} {largest}&amp;quot;)&lt;br /&gt;
            print(&amp;quot;Datele sunt introduse corect.&amp;quot;)&lt;br /&gt;
        else:&lt;br /&gt;
            print(&amp;quot;Datele nu corespund restricțiilor impuse.&amp;quot;, file=sys.stderr)&lt;br /&gt;
            sys.exit(1)&lt;br /&gt;
    except Exception as e:&lt;br /&gt;
        print(&amp;quot;Datele nu corespund restricțiilor impuse.&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
            &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Explicatie==&lt;br /&gt;
&lt;br /&gt;
validate_input(n, matrix) -&amp;gt; bool&lt;br /&gt;
Aceasta functie primeste dimensiunea matricei n si matricea propriu-zisa matrix si verifica daca datele sunt valide sau nu. Functia intoarce True daca datele sunt valide si False altfel. Mai exact, functia verifica daca:&lt;br /&gt;
&lt;br /&gt;
n este mai mare decat 0 si mai mic sau egal cu 500;&lt;br /&gt;
matricea matrix contine exact n linii si fiecare linie contine exact n elemente;&lt;br /&gt;
fiecare element din matricea matrix este mai mare sau egal cu 1 si mai mic sau egal cu 60000.&lt;br /&gt;
find_changed_numbers(n, matrix) -&amp;gt; tuple&lt;br /&gt;
Aceasta functie primeste dimensiunea matricei n si matricea propriu-zisa matrix si identifica cele mai mici si cele mai mari numere consecutive schimbate din matrice. Functia intoarce cele doua numere ca o pereche de valori. Mai exact, functia:&lt;br /&gt;
&lt;br /&gt;
parcurge fiecare linie a matricei matrix;&lt;br /&gt;
compara fiecare element dintr-o linie cu elementul urmator din aceeasi linie;&lt;br /&gt;
daca diferenta dintre cele doua elemente este mai mare decat 1, atunci cele doua elemente formeaza o pereche de numere consecutive schimbate;&lt;br /&gt;
se tine evidenta celor mai mici si celor mai mari numere din astfel de perechi;&lt;br /&gt;
cele mai mici si cele mai mari numere sunt intoarse sub forma de o pereche de valori.&lt;br /&gt;
main()&lt;br /&gt;
Aceasta functie citeste datele de intrare din fisierul &amp;quot;numere9.in&amp;quot;, verifica daca datele sunt valide prin apelul functiei validate_input, identifica cele mai mici si cele mai mari numere consecutive schimbate prin apelul functiei find_changed_numbers, scrie cele doua numere in fisierul de iesire &amp;quot;numere9.out&amp;quot; si afiseaza un mesaj de confirmare a validitatii datelor daca datele sunt valide sau afiseaza un mesaj de eroare daca datele nu sunt valide.&lt;/div&gt;</summary>
		<author><name>Sovago Rares-Andrei</name></author>
	</entry>
	<entry>
		<id>https://wiki.universitas.ro/index.php?title=1374_-_numere9&amp;diff=5478</id>
		<title>1374 - numere9</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=1374_-_numere9&amp;diff=5478"/>
		<updated>2023-04-29T15:45:58Z</updated>

		<summary type="html">&lt;p&gt;Sovago Rares-Andrei: /* Restricţii şi precizări */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Cerința==&lt;br /&gt;
&lt;br /&gt;
Mircea este pasionat de programare. El a început să rezolve probleme din ce în ce mai grele. Astfel a ajuns la o problemă, care are ca date de intrare un tablou pătratic cu n linii şi n coloane, componente tabloului fiind toate numerele naturale distincte de la 1 la n2. Pentru a verifica programul pe care l-a scris îi trebuie un fişier care să conţină tabloul respectiv. După ce a creat acest fişier, fratele său, pus pe şotii îi umblă în fişier şi îi schimbă câteva numere consecutive, cu numărul 0. Când se întoarce Mircea de la joacă constată cu stupoare că nu îi merge programul pentru testul respectiv. După câteva ore de depanare îşi dă seama că programul lui este corect şi că fişierul de intrare are probleme.&lt;br /&gt;
&lt;br /&gt;
Scrieţi un program care să-l ajute pe Mircea, găsindu-i cel mai mic şi cel mai mare dintre numerele consecutive schimbate de fratele său.&lt;br /&gt;
== Date de intrare ==&lt;br /&gt;
&lt;br /&gt;
În fişierul &#039;&#039;&#039;numere9.in&#039;&#039;&#039; se dă pe prima linie n, iar pe următoarele n linii elementele tabloului, câte n elemente pe o linie, separate între ele prin câte un spaţiu, după modificările făcute de fratele lui Mircea.&lt;br /&gt;
&lt;br /&gt;
== Date de ieșire ==&lt;br /&gt;
&lt;br /&gt;
Dacă datele sunt introduse corect, pe ecran se va afișa: &amp;quot;Datele sunt introduse corect.&amp;quot; În fişierul &#039;&#039;&#039;numere9.out&#039;&#039;&#039; se va scrie pe un singur rând cu un singur spaţiu între ele numerele cerute (primul fiind cel mai mic).&lt;br /&gt;
&lt;br /&gt;
În cazul în care datele nu respectă restricțiile, se va afișa: &amp;quot;Datele nu corespund restricțiilor impuse.&amp;quot;.&lt;br /&gt;
== Restricţii şi precizări ==&lt;br /&gt;
*0&amp;lt;n≤500&lt;br /&gt;
*Fratele lui Mircea schimbă cel puţin un număr în fişier.&lt;br /&gt;
*Numerele schimbate de fratele lui Mircea sunt mai mici sau cel mult egale cu &#039;&#039;&#039;60000&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
== Exemple ==&lt;br /&gt;
===Exemplul 1===&lt;br /&gt;
; &#039;&#039;numere9.in&#039;&#039;&lt;br /&gt;
:3&lt;br /&gt;
:5 0 7&lt;br /&gt;
:0 0 1&lt;br /&gt;
:6 9 8&lt;br /&gt;
; &#039;&#039;ecran&#039;&#039;&lt;br /&gt;
:Datele sunt introduse corect.&lt;br /&gt;
; &#039;&#039;numere9.out&#039;&#039;&lt;br /&gt;
:6 9&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Exemplul 2===&lt;br /&gt;
; &#039;&#039;numere9.in&#039;&#039;&lt;br /&gt;
:3&lt;br /&gt;
:2 3 1&lt;br /&gt;
:7 5 4&lt;br /&gt;
:8 0 6&lt;br /&gt;
; &#039;&#039;ecran&#039;&#039;&lt;br /&gt;
:Datele sunt introduse corect.&lt;br /&gt;
; &#039;&#039;numere9.out&#039;&#039;&lt;br /&gt;
:1 7 &lt;br /&gt;
&lt;br /&gt;
===Exemplul 3===&lt;br /&gt;
; &#039;&#039;numere9.in&#039;&#039;&lt;br /&gt;
:2&lt;br /&gt;
:4 5&lt;br /&gt;
:1&lt;br /&gt;
; &#039;&#039;ecran&#039;&#039;&lt;br /&gt;
:Datele nu corespund restricțiilor impuse.&lt;br /&gt;
; &#039;&#039;numere9.out&#039;&#039;&lt;br /&gt;
:&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Rezolvare == &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
# 1374 - numere9&lt;br /&gt;
def validate_input(n: int, matrix: list[list[int]]) -&amp;gt; bool:&lt;br /&gt;
    if not 0 &amp;lt; n &amp;lt;= 500:&lt;br /&gt;
        print(&amp;quot;Error: The size of the matrix must be between 1 and 500.&amp;quot;)&lt;br /&gt;
        return False&lt;br /&gt;
    for i in range(n):&lt;br /&gt;
        for j in range(n):&lt;br /&gt;
            if not 0 &amp;lt;= matrix[i][j] &amp;lt;= 60000:&lt;br /&gt;
                print(f&amp;quot;Error: Invalid number &#039;{matrix[i][j]}&#039; at line {i+2}, column {j+1}.&amp;quot;)&lt;br /&gt;
                return False&lt;br /&gt;
    return True&lt;br /&gt;
&lt;br /&gt;
def find_changed_numbers(n: int, matrix: list[list[int]]) -&amp;gt; tuple[int, int]:&lt;br /&gt;
    min_changed, max_changed = float(&#039;inf&#039;), float(&#039;-inf&#039;)&lt;br /&gt;
    for i in range(n):&lt;br /&gt;
        for j in range(n-1):&lt;br /&gt;
            if matrix[i][j] == 0 or matrix[i][j+1] == 0:&lt;br /&gt;
                continue&lt;br /&gt;
            elif abs(matrix[i][j+1] - matrix[i][j]) &amp;gt; 1:&lt;br /&gt;
                min_changed = min(min_changed, matrix[i][j], matrix[i][j+1])&lt;br /&gt;
                max_changed = max(max_changed, matrix[i][j], matrix[i][j+1])&lt;br /&gt;
    return (min_changed, max_changed)&lt;br /&gt;
&lt;br /&gt;
if __name__ == &#039;__main__&#039;:&lt;br /&gt;
    try:&lt;br /&gt;
        with open(&#039;numere9.in&#039;, &#039;r&#039;) as f:&lt;br /&gt;
            n = int(f.readline())&lt;br /&gt;
            matrix = []&lt;br /&gt;
            for i in range(n):&lt;br /&gt;
                row = list(map(int, f.readline().split()))&lt;br /&gt;
                if len(row) != n:&lt;br /&gt;
                    raise ValueError(&amp;quot;Datele nu corespund restricțiilor impuse.&amp;quot;)&lt;br /&gt;
                matrix.append(row)&lt;br /&gt;
            if len(matrix) != n:&lt;br /&gt;
                raise ValueError(&amp;quot;Datele nu corespund restricțiilor impuse.&amp;quot;)&lt;br /&gt;
        if validate_input(n, matrix):&lt;br /&gt;
            smallest, largest = find_changed_numbers(n, matrix)&lt;br /&gt;
            with open(&#039;numere9.out&#039;, &#039;w&#039;) as f:&lt;br /&gt;
                f.write(f&amp;quot;{smallest} {largest}&amp;quot;)&lt;br /&gt;
            print(&amp;quot;Datele sunt introduse corect.&amp;quot;)&lt;br /&gt;
        else:&lt;br /&gt;
            print(&amp;quot;Datele nu corespund restricțiilor impuse.&amp;quot;, file=sys.stderr)&lt;br /&gt;
            sys.exit(1)&lt;br /&gt;
    except Exception as e:&lt;br /&gt;
        print(&amp;quot;Datele nu corespund restricțiilor impuse.&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
            &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Explicatie==&lt;br /&gt;
&lt;br /&gt;
validate_input(n, matrix) -&amp;gt; bool&lt;br /&gt;
Aceasta functie primeste dimensiunea matricei n si matricea propriu-zisa matrix si verifica daca datele sunt valide sau nu. Functia intoarce True daca datele sunt valide si False altfel. Mai exact, functia verifica daca:&lt;br /&gt;
&lt;br /&gt;
n este mai mare decat 0 si mai mic sau egal cu 500;&lt;br /&gt;
matricea matrix contine exact n linii si fiecare linie contine exact n elemente;&lt;br /&gt;
fiecare element din matricea matrix este mai mare sau egal cu 1 si mai mic sau egal cu 60000.&lt;br /&gt;
find_changed_numbers(n, matrix) -&amp;gt; tuple&lt;br /&gt;
Aceasta functie primeste dimensiunea matricei n si matricea propriu-zisa matrix si identifica cele mai mici si cele mai mari numere consecutive schimbate din matrice. Functia intoarce cele doua numere ca o pereche de valori. Mai exact, functia:&lt;br /&gt;
&lt;br /&gt;
parcurge fiecare linie a matricei matrix;&lt;br /&gt;
compara fiecare element dintr-o linie cu elementul urmator din aceeasi linie;&lt;br /&gt;
daca diferenta dintre cele doua elemente este mai mare decat 1, atunci cele doua elemente formeaza o pereche de numere consecutive schimbate;&lt;br /&gt;
se tine evidenta celor mai mici si celor mai mari numere din astfel de perechi;&lt;br /&gt;
cele mai mici si cele mai mari numere sunt intoarse sub forma de o pereche de valori.&lt;br /&gt;
main()&lt;br /&gt;
Aceasta functie citeste datele de intrare din fisierul &amp;quot;numere9.in&amp;quot;, verifica daca datele sunt valide prin apelul functiei validate_input, identifica cele mai mici si cele mai mari numere consecutive schimbate prin apelul functiei find_changed_numbers, scrie cele doua numere in fisierul de iesire &amp;quot;numere9.out&amp;quot; si afiseaza un mesaj de confirmare a validitatii datelor daca datele sunt valide sau afiseaza un mesaj de eroare daca datele nu sunt valide.&lt;/div&gt;</summary>
		<author><name>Sovago Rares-Andrei</name></author>
	</entry>
	<entry>
		<id>https://wiki.universitas.ro/index.php?title=2032_-_Mmult&amp;diff=5477</id>
		<title>2032 - Mmult</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=2032_-_Mmult&amp;diff=5477"/>
		<updated>2023-04-29T15:43:36Z</updated>

		<summary type="html">&lt;p&gt;Sovago Rares-Andrei: /* Restricţii şi precizări */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Cerința==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Alexandru, mare informatician, a decis să își impresioneze prietenii cu următoarea problemă: Dându-se un vector cu N numere naturale nenule, se întreabă care este numărul minim de mulțimi cu numere consecutive de forma &#039;&#039;&#039;{1...K}&#039;&#039;&#039; în care acesta poate fi împărțit. Spre exemplu vectorul &#039;&#039;&#039;A = {1, 3, 2, 2, 1, 4}&#039;&#039;&#039; poate fi împărțit în număr minim de partiții astfel &#039;&#039;&#039;{1, 2, 3, 4}, {1, 2}&#039;&#039;&#039;.&lt;br /&gt;
Cum această problemă a fost prea dificilă pentru prietenii săi, Alexandru te roagă pe tine să o rezolvi.&lt;br /&gt;
&lt;br /&gt;
== Date de intrare ==&lt;br /&gt;
&lt;br /&gt;
Fișierul de intrare &#039;&#039;&#039;mmult.in&#039;&#039;&#039; conține pe prima linie numărul N, iar pe a doua linie N numere naturale separate prin spații.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Date de ieșire ==&lt;br /&gt;
&lt;br /&gt;
Dacă datele sunt introduse corect, pe ecran se va afișa: &amp;quot;Datele sunt introduse Fișierul de ieșire &#039;&#039;&#039;mmult.out&#039;&#039;&#039; va conține pe prima linie numărul S, reprezentând răspunsul problemei date de Alex.&lt;br /&gt;
&lt;br /&gt;
În cazul în care datele nu respectă restricțiile, se va afișa: &amp;quot;Datele nu corespund restricțiilor impuse.&amp;quot;.&lt;br /&gt;
== Restricţii şi precizări ==&lt;br /&gt;
*&#039;&#039;&#039;1 ≤ N ≤ 100.000&#039;&#039;&#039;&lt;br /&gt;
*numerele de pe a doua linie a fișierului de intrare vor fi mai mici decât &#039;&#039;&#039;1.000.000&#039;&#039;&#039;&lt;br /&gt;
*dacă problema nu are soluție, se va afișa -1&lt;br /&gt;
&lt;br /&gt;
== Exemple ==&lt;br /&gt;
===Exemplul 1===&lt;br /&gt;
; &#039;&#039;mmult.in&#039;&#039;&lt;br /&gt;
:6&lt;br /&gt;
:1 3 2 2 1 4&lt;br /&gt;
; &#039;&#039;ecran&#039;&#039;&lt;br /&gt;
:Datele sunt introduse corect.&lt;br /&gt;
; &#039;&#039;mmult.out&#039;&#039;&lt;br /&gt;
:2&lt;br /&gt;
===Exemplul 2===&lt;br /&gt;
; &#039;&#039;mmult.in&#039;&#039;&lt;br /&gt;
:5&lt;br /&gt;
:2 3 1 1 2&lt;br /&gt;
; &#039;&#039;ecran&#039;&#039;&lt;br /&gt;
:Datele sunt introduse corect.&lt;br /&gt;
; &#039;&#039;mmult.out&#039;&#039;&lt;br /&gt;
:2&lt;br /&gt;
===Exemplul 3===&lt;br /&gt;
; &#039;&#039;mmult.in&#039;&#039;&lt;br /&gt;
:0&lt;br /&gt;
; &#039;&#039;ecran&#039;&#039;&lt;br /&gt;
:Datele nu corespund restricțiilor impuse.&lt;br /&gt;
; &#039;&#039;mmult.out&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
== Rezolvare == &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
# 2032 - Mmult&lt;br /&gt;
import sys&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def validate_input(n, nums):&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    Validates input data for the problem&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    if n &amp;lt; 1 or n &amp;gt; 100000:&lt;br /&gt;
        return False&lt;br /&gt;
&lt;br /&gt;
    for num in nums:&lt;br /&gt;
        if num &amp;gt;= 1000000:&lt;br /&gt;
            return False&lt;br /&gt;
&lt;br /&gt;
    return True&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def solve(n, nums):&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    Solves the problem and returns the answer as an integer&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    f = [0] * 100001&lt;br /&gt;
    m = 0&lt;br /&gt;
&lt;br /&gt;
    for x in nums:&lt;br /&gt;
        m = max(m, x)&lt;br /&gt;
        f[x] += 1&lt;br /&gt;
&lt;br /&gt;
    for i in range(2, m + 1):&lt;br /&gt;
        if f[i] &amp;gt; f[i - 1]:&lt;br /&gt;
            return -1&lt;br /&gt;
&lt;br /&gt;
    return f[1]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
if __name__ == &#039;__main__&#039;:&lt;br /&gt;
    # Read input&lt;br /&gt;
    with open(&#039;mmult.in&#039;, &#039;r&#039;) as fin:&lt;br /&gt;
        n = int(fin.readline())&lt;br /&gt;
        nums = list(map(int, fin.readline().split()))&lt;br /&gt;
&lt;br /&gt;
    # Validate input&lt;br /&gt;
    if not validate_input(n, nums):&lt;br /&gt;
        print(&amp;quot;Datele nu corespund restricțiilor impuse.&amp;quot;)&lt;br /&gt;
        sys.exit(0)&lt;br /&gt;
&lt;br /&gt;
    # Solve problem&lt;br /&gt;
    ans = solve(n, nums)&lt;br /&gt;
&lt;br /&gt;
    # Write output&lt;br /&gt;
    with open(&#039;mmult.out&#039;, &#039;w&#039;) as fout:&lt;br /&gt;
        fout.write(str(ans))&lt;br /&gt;
&lt;br /&gt;
    # Print success message&lt;br /&gt;
    print(&lt;br /&gt;
        &amp;quot;Datele sunt introduse corect.&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
            &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Explicatie==&lt;br /&gt;
&lt;br /&gt;
Funcția validate_input(n, nums):&lt;br /&gt;
Această funcție primește ca argumente un număr întreg n și o listă de numere întregi nums. Funcția verifică dacă acestea respectă restricțiile impuse de problemă și returnează True în caz afirmativ sau False în caz contrar. Mai precis, funcția verifică următoarele condiții:&lt;br /&gt;
&lt;br /&gt;
n trebuie să fie între 1 și 100000, inclusiv&lt;br /&gt;
toate numerele din lista nums trebuie să fie mai mici decât 1000000.&lt;br /&gt;
Dacă datele introduse respectă aceste restricții, funcția returnează True, altfel returnează False.&lt;br /&gt;
&lt;br /&gt;
Funcția solve(n, nums):&lt;br /&gt;
Această funcție primește ca argumente un număr întreg n și o listă de numere întregi nums. Funcția rezolvă problema descrisă în enunțul problemei și returnează răspunsul ca un număr întreg. Mai precis, funcția efectuează următoarele operații:&lt;br /&gt;
&lt;br /&gt;
inițializează un vector f cu 100001 elemente cu valoarea 0&lt;br /&gt;
găsește numărul maxim m din lista nums&lt;br /&gt;
pentru fiecare număr x din lista nums, incrementează valoarea elementului f[x]&lt;br /&gt;
parcurge elementele vectorului f de la 2 la m și verifică dacă f[i] este mai mare decât f[i-1]. Dacă da, înseamnă că problema nu are soluție și funcția returnează -1.&lt;br /&gt;
dacă toate elementele vectorului f respectă această proprietate, funcția returnează valoarea f[1].&lt;br /&gt;
Funcția main():&lt;br /&gt;
Această funcție este funcția principală a programului și este responsabilă pentru citirea datelor de intrare din fișierul &amp;quot;mmult.in&amp;quot;, validarea lor utilizând funcția validate_input, rezolvarea problemei utilizând funcția solve, scrierea răspunsului în fișierul &amp;quot;mmult.out&amp;quot; și afișarea unui mesaj corespunzător pe ecran. Mai precis, funcția efectuează următoarele operații:&lt;br /&gt;
&lt;br /&gt;
deschide fișierul &amp;quot;mmult.in&amp;quot; în modul de citire și citește valorile pentru n și nums utilizând metoda readline și funcția map&lt;br /&gt;
validează datele introduse utilizând funcția validate_input. Dacă acestea nu respectă restricțiile, afișează un mesaj corespunzător pe ecran și oprește programul utilizând funcția exit.&lt;br /&gt;
rezolvă problema utilizând funcția solve și stochează rezultatul în variabila ans&lt;br /&gt;
deschide fișierul &amp;quot;mmult.out&lt;/div&gt;</summary>
		<author><name>Sovago Rares-Andrei</name></author>
	</entry>
	<entry>
		<id>https://wiki.universitas.ro/index.php?title=2032_-_Mmult&amp;diff=5475</id>
		<title>2032 - Mmult</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=2032_-_Mmult&amp;diff=5475"/>
		<updated>2023-04-29T15:42:59Z</updated>

		<summary type="html">&lt;p&gt;Sovago Rares-Andrei: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Cerința==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Alexandru, mare informatician, a decis să își impresioneze prietenii cu următoarea problemă: Dându-se un vector cu N numere naturale nenule, se întreabă care este numărul minim de mulțimi cu numere consecutive de forma &#039;&#039;&#039;{1...K}&#039;&#039;&#039; în care acesta poate fi împărțit. Spre exemplu vectorul &#039;&#039;&#039;A = {1, 3, 2, 2, 1, 4}&#039;&#039;&#039; poate fi împărțit în număr minim de partiții astfel &#039;&#039;&#039;{1, 2, 3, 4}, {1, 2}&#039;&#039;&#039;.&lt;br /&gt;
Cum această problemă a fost prea dificilă pentru prietenii săi, Alexandru te roagă pe tine să o rezolvi.&lt;br /&gt;
&lt;br /&gt;
== Date de intrare ==&lt;br /&gt;
&lt;br /&gt;
Fișierul de intrare &#039;&#039;&#039;mmult.in&#039;&#039;&#039; conține pe prima linie numărul N, iar pe a doua linie N numere naturale separate prin spații.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Date de ieșire ==&lt;br /&gt;
&lt;br /&gt;
Dacă datele sunt introduse corect, pe ecran se va afișa: &amp;quot;Datele sunt introduse Fișierul de ieșire &#039;&#039;&#039;mmult.out&#039;&#039;&#039; va conține pe prima linie numărul S, reprezentând răspunsul problemei date de Alex.&lt;br /&gt;
&lt;br /&gt;
În cazul în care datele nu respectă restricțiile, se va afișa: &amp;quot;Datele nu corespund restricțiilor impuse.&amp;quot;.&lt;br /&gt;
== Restricţii şi precizări ==&lt;br /&gt;
*&#039;&#039;&#039;1 ≤ N ≤ 100.000&#039;&#039;&#039;&lt;br /&gt;
*numerele de pe a doua linie a fișierului de intrare vor fi mai mici decât &amp;lt;nowiki&amp;gt;&#039;&#039;&#039;1.000.000&#039;&#039;&#039;&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
*dacă problema nu are soluție, se va afișa -1&lt;br /&gt;
== Exemple ==&lt;br /&gt;
===Exemplul 1===&lt;br /&gt;
; &#039;&#039;mmult.in&#039;&#039;&lt;br /&gt;
:6&lt;br /&gt;
:1 3 2 2 1 4&lt;br /&gt;
; &#039;&#039;ecran&#039;&#039;&lt;br /&gt;
:Datele sunt introduse corect.&lt;br /&gt;
; &#039;&#039;mmult.out&#039;&#039;&lt;br /&gt;
:2&lt;br /&gt;
===Exemplul 2===&lt;br /&gt;
; &#039;&#039;mmult.in&#039;&#039;&lt;br /&gt;
:5&lt;br /&gt;
:2 3 1 1 2&lt;br /&gt;
; &#039;&#039;ecran&#039;&#039;&lt;br /&gt;
:Datele sunt introduse corect.&lt;br /&gt;
; &#039;&#039;mmult.out&#039;&#039;&lt;br /&gt;
:2&lt;br /&gt;
===Exemplul 3===&lt;br /&gt;
; &#039;&#039;mmult.in&#039;&#039;&lt;br /&gt;
:0&lt;br /&gt;
; &#039;&#039;ecran&#039;&#039;&lt;br /&gt;
:Datele nu corespund restricțiilor impuse.&lt;br /&gt;
; &#039;&#039;mmult.out&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
== Rezolvare == &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
# 2032 - Mmult&lt;br /&gt;
import sys&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def validate_input(n, nums):&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    Validates input data for the problem&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    if n &amp;lt; 1 or n &amp;gt; 100000:&lt;br /&gt;
        return False&lt;br /&gt;
&lt;br /&gt;
    for num in nums:&lt;br /&gt;
        if num &amp;gt;= 1000000:&lt;br /&gt;
            return False&lt;br /&gt;
&lt;br /&gt;
    return True&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def solve(n, nums):&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    Solves the problem and returns the answer as an integer&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    f = [0] * 100001&lt;br /&gt;
    m = 0&lt;br /&gt;
&lt;br /&gt;
    for x in nums:&lt;br /&gt;
        m = max(m, x)&lt;br /&gt;
        f[x] += 1&lt;br /&gt;
&lt;br /&gt;
    for i in range(2, m + 1):&lt;br /&gt;
        if f[i] &amp;gt; f[i - 1]:&lt;br /&gt;
            return -1&lt;br /&gt;
&lt;br /&gt;
    return f[1]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
if __name__ == &#039;__main__&#039;:&lt;br /&gt;
    # Read input&lt;br /&gt;
    with open(&#039;mmult.in&#039;, &#039;r&#039;) as fin:&lt;br /&gt;
        n = int(fin.readline())&lt;br /&gt;
        nums = list(map(int, fin.readline().split()))&lt;br /&gt;
&lt;br /&gt;
    # Validate input&lt;br /&gt;
    if not validate_input(n, nums):&lt;br /&gt;
        print(&amp;quot;Datele nu corespund restricțiilor impuse.&amp;quot;)&lt;br /&gt;
        sys.exit(0)&lt;br /&gt;
&lt;br /&gt;
    # Solve problem&lt;br /&gt;
    ans = solve(n, nums)&lt;br /&gt;
&lt;br /&gt;
    # Write output&lt;br /&gt;
    with open(&#039;mmult.out&#039;, &#039;w&#039;) as fout:&lt;br /&gt;
        fout.write(str(ans))&lt;br /&gt;
&lt;br /&gt;
    # Print success message&lt;br /&gt;
    print(&lt;br /&gt;
        &amp;quot;Datele sunt introduse corect.&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
            &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Explicatie==&lt;br /&gt;
&lt;br /&gt;
Funcția validate_input(n, nums):&lt;br /&gt;
Această funcție primește ca argumente un număr întreg n și o listă de numere întregi nums. Funcția verifică dacă acestea respectă restricțiile impuse de problemă și returnează True în caz afirmativ sau False în caz contrar. Mai precis, funcția verifică următoarele condiții:&lt;br /&gt;
&lt;br /&gt;
n trebuie să fie între 1 și 100000, inclusiv&lt;br /&gt;
toate numerele din lista nums trebuie să fie mai mici decât 1000000.&lt;br /&gt;
Dacă datele introduse respectă aceste restricții, funcția returnează True, altfel returnează False.&lt;br /&gt;
&lt;br /&gt;
Funcția solve(n, nums):&lt;br /&gt;
Această funcție primește ca argumente un număr întreg n și o listă de numere întregi nums. Funcția rezolvă problema descrisă în enunțul problemei și returnează răspunsul ca un număr întreg. Mai precis, funcția efectuează următoarele operații:&lt;br /&gt;
&lt;br /&gt;
inițializează un vector f cu 100001 elemente cu valoarea 0&lt;br /&gt;
găsește numărul maxim m din lista nums&lt;br /&gt;
pentru fiecare număr x din lista nums, incrementează valoarea elementului f[x]&lt;br /&gt;
parcurge elementele vectorului f de la 2 la m și verifică dacă f[i] este mai mare decât f[i-1]. Dacă da, înseamnă că problema nu are soluție și funcția returnează -1.&lt;br /&gt;
dacă toate elementele vectorului f respectă această proprietate, funcția returnează valoarea f[1].&lt;br /&gt;
Funcția main():&lt;br /&gt;
Această funcție este funcția principală a programului și este responsabilă pentru citirea datelor de intrare din fișierul &amp;quot;mmult.in&amp;quot;, validarea lor utilizând funcția validate_input, rezolvarea problemei utilizând funcția solve, scrierea răspunsului în fișierul &amp;quot;mmult.out&amp;quot; și afișarea unui mesaj corespunzător pe ecran. Mai precis, funcția efectuează următoarele operații:&lt;br /&gt;
&lt;br /&gt;
deschide fișierul &amp;quot;mmult.in&amp;quot; în modul de citire și citește valorile pentru n și nums utilizând metoda readline și funcția map&lt;br /&gt;
validează datele introduse utilizând funcția validate_input. Dacă acestea nu respectă restricțiile, afișează un mesaj corespunzător pe ecran și oprește programul utilizând funcția exit.&lt;br /&gt;
rezolvă problema utilizând funcția solve și stochează rezultatul în variabila ans&lt;br /&gt;
deschide fișierul &amp;quot;mmult.out&lt;/div&gt;</summary>
		<author><name>Sovago Rares-Andrei</name></author>
	</entry>
	<entry>
		<id>https://wiki.universitas.ro/index.php?title=2177_-_Cod3&amp;diff=5474</id>
		<title>2177 - Cod3</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=2177_-_Cod3&amp;diff=5474"/>
		<updated>2023-04-29T15:39:59Z</updated>

		<summary type="html">&lt;p&gt;Sovago Rares-Andrei: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Cerința==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Dexter a moştenit o avere fabuloasă, dar este închisă într-un seif. Unchiul său, cel care i-a lăsat averea, a dorit să îl pună la încercare astfel: a umplut o cutie foarte mare cu bileţele pe care sunt scrise numere naturale din mulţimea &#039;&#039;&#039;{0, 1, 2, ..., 99}&#039;&#039;&#039;. Pe fiecare bileţel este scris un singur număr. Dexter trebuie să formeze perechi de bileţele care au scrise pe ele acelaşi număr. La sfârşit, vor rămâne câteva bileţele fără pereche. Codul de acces la seif este format din numerele rămase pe bileţelele fără pereche, aşezate în ordine crescătoare şi fără spaţiu între ele.&lt;br /&gt;
Scrieţi un program care să furnizeze codul de acces la seif.&lt;br /&gt;
== Date de intrare ==&lt;br /&gt;
&lt;br /&gt;
Fişierul de intrare &#039;&#039;&#039;cod3.in&#039;&#039;&#039; conţine pe prima linie numărul natural n, reprezentând numărul bileţelelor aflate în cutie. Pe următoarea linie a fişierului se află cele n numere scrise pe bileţele, separate prin câte un spaţiu.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Date de ieșire ==&lt;br /&gt;
&lt;br /&gt;
Dacă datele sunt introduse corect, pe ecran se va afișa: &amp;quot;Datele sunt introduse corect.&amp;quot; Fişierul de ieşire &#039;&#039;&#039;cod3.out&#039;&#039;&#039; va conţine pe prima linie numerele din care este compus codul, în ordine crescătoare şi fără spaţii între ele.&lt;br /&gt;
&lt;br /&gt;
În cazul în care datele nu respectă restricțiile, se va afișa: &amp;quot;Datele nu corespund restricțiilor impuse.&amp;quot;.&lt;br /&gt;
== Restricţii şi precizări ==&lt;br /&gt;
*&#039;&#039;&#039;1 ≤ n ≤ 90000&#039;&#039;&#039;&lt;br /&gt;
== Exemple ==&lt;br /&gt;
===Exemplul 1===&lt;br /&gt;
; &#039;&#039;cod3.in&#039;&#039;&lt;br /&gt;
:10&lt;br /&gt;
:11 3 11 11 12 2 11 12 3 11&lt;br /&gt;
; &#039;&#039;ecran&#039;&#039;&lt;br /&gt;
:Datele sunt introduse corect.&lt;br /&gt;
; &#039;&#039;cod3.out&#039;&#039;&lt;br /&gt;
:211&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Exemplul 2===&lt;br /&gt;
; &#039;&#039;cod3.in&#039;&#039;&#039;&lt;br /&gt;
:5&lt;br /&gt;
:2 3 2 3 4&lt;br /&gt;
; &#039;&#039;ecran&#039;&#039;&lt;br /&gt;
:Datele sunt introduse corect.&lt;br /&gt;
; &#039;&#039;cod3.out&#039;&#039;&lt;br /&gt;
:4&lt;br /&gt;
===Exemplul 3===&lt;br /&gt;
; &#039;&#039;cod3.in&#039;&#039;&#039;&lt;br /&gt;
:100000&lt;br /&gt;
:1 2 3&lt;br /&gt;
; &#039;&#039;ecran&#039;&#039;&lt;br /&gt;
:Datele nu corespund restricțiilor impuse.&lt;br /&gt;
; &#039;&#039;cod3.out&#039;&#039;&lt;br /&gt;
:&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Rezolvare == &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
# 2177 - Cod3&lt;br /&gt;
import sys&lt;br /&gt;
&lt;br /&gt;
def validate_data(n, nums):&lt;br /&gt;
    if not 1 &amp;lt;= n &amp;lt;= 90000:&lt;br /&gt;
        return False&lt;br /&gt;
    if len(nums) != n:&lt;br /&gt;
        return False&lt;br /&gt;
    for num in nums:&lt;br /&gt;
        if not 0 &amp;lt;= num &amp;lt;= 99:&lt;br /&gt;
            return False&lt;br /&gt;
    return True&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def solve_problem(n, nums):&lt;br /&gt;
    fr = [0] * 100&lt;br /&gt;
    for num in nums:&lt;br /&gt;
        fr[num] += 1&lt;br /&gt;
    code_nums = []&lt;br /&gt;
    for i in range(100):&lt;br /&gt;
        if fr[i] % 2 == 1:&lt;br /&gt;
            code_nums.append(i)&lt;br /&gt;
    return code_nums&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
if __name__ == &amp;quot;__main__&amp;quot;:&lt;br /&gt;
    with open(&amp;quot;cod3.in&amp;quot;) as fin, open(&amp;quot;cod3.out&amp;quot;, &amp;quot;w&amp;quot;) as fout:&lt;br /&gt;
        n = int(fin.readline().strip())&lt;br /&gt;
        nums = list(map(int, fin.readline().strip().split()))&lt;br /&gt;
        if validate_data(n, nums):&lt;br /&gt;
            print( &amp;quot;Datele sunt introduse corect.\n&amp;quot;)&lt;br /&gt;
            code_nums = solve_problem(n, nums)&lt;br /&gt;
            fout.write(&amp;quot;&amp;quot;.join(str(num) for num in code_nums))&lt;br /&gt;
        else:&lt;br /&gt;
            print(&amp;quot;Datele nu corespund restricțiilor impuse.&amp;quot;)&lt;br /&gt;
            sys.exit(0)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
            &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Explicatie==&lt;br /&gt;
&lt;br /&gt;
Funcția validate_data(n, nums):&lt;br /&gt;
&lt;br /&gt;
Această funcție primește două argumente: n, care reprezintă numărul de întregi, și nums, care este o listă de n întregi.&lt;br /&gt;
Funcția returnează True dacă datele de intrare respectă restricțiile impuse, și False în caz contrar.&lt;br /&gt;
Restricțiile verificate de această funcție sunt:&lt;br /&gt;
1 ≤ n ≤ 90000 - n trebuie să fie între 1 și 90000 (inclusiv).&lt;br /&gt;
0 ≤ nums[i] ≤ 99 - fiecare întreg din nums trebuie să fie între 0 și 99 (inclusiv).&lt;br /&gt;
Funcția folosește o simplă declarație if pentru a verifica fiecare restricție, și returnează False dacă vreo restricție este încălcată. Dacă toate restricțiile sunt respectate, funcția returnează True.&lt;br /&gt;
Funcția solve_problem(n, nums):&lt;br /&gt;
&lt;br /&gt;
Această funcție primește două argumente: n, care reprezintă numărul de întregi, și nums, care este o listă de n întregi.&lt;br /&gt;
Funcția returnează o listă de întregi care reprezintă codul.&lt;br /&gt;
Funcția începe prin a crea o listă fr de 100 de întregi, inițializați cu 0. Această listă este folosită pentru a ține evidența de câte ori apare fiecare întreg între 0 și 99 în nums.&lt;br /&gt;
Funcția apoi parcurge întreaga listă nums și incrementează elementul corespunzător din lista fr.&lt;br /&gt;
Funcția în cele din urmă parcurge întreaga listă de întregi între 0 și 99 și adaugă orice întreg în lista cod dacă acesta apare de un număr impar de ori în nums.&lt;br /&gt;
Funcția returnează lista cod.&lt;br /&gt;
Blocul if __name__ == &amp;quot;__main__&amp;quot;:&lt;br /&gt;
&lt;br /&gt;
Acest bloc de cod este executat atunci când scriptul este rulat ca program principal.&lt;br /&gt;
Blocul citește datele de intrare din fișierul cod3.in.&lt;br /&gt;
Blocul apoi apelează funcția validate_data(n, nums) pentru a verifica dacă datele de intrare sunt valide. Dacă datele de intrare sunt invalide, blocul scrie &amp;quot;Datele nu corespund restricțiilor impuse.&amp;quot; în fișierul de ieșire și oprește programul folosind sys.exit(0).&lt;br /&gt;
Dacă datele de intrare sunt valide, blocul scrie &amp;quot;Datele sunt introduse corect.&amp;quot; în fișierul de ieșire și apelează funcția solve_problem(n, nums) pentru a rezolva problema.&lt;/div&gt;</summary>
		<author><name>Sovago Rares-Andrei</name></author>
	</entry>
	<entry>
		<id>https://wiki.universitas.ro/index.php?title=2177_-_Cod3&amp;diff=5473</id>
		<title>2177 - Cod3</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=2177_-_Cod3&amp;diff=5473"/>
		<updated>2023-04-29T15:39:06Z</updated>

		<summary type="html">&lt;p&gt;Sovago Rares-Andrei: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Cerința==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Dexter a moştenit o avere fabuloasă, dar este închisă într-un seif. Unchiul său, cel care i-a lăsat averea, a dorit să îl pună la încercare astfel: a umplut o cutie foarte mare cu bileţele pe care sunt scrise numere naturale din mulţimea &#039;&#039;&#039;{0, 1, 2, ..., 99}&#039;&#039;&#039;. Pe fiecare bileţel este scris un singur număr. Dexter trebuie să formeze perechi de bileţele care au scrise pe ele acelaşi număr. La sfârşit, vor rămâne câteva bileţele fără pereche. Codul de acces la seif este format din numerele rămase pe bileţelele fără pereche, aşezate în ordine crescătoare şi fără spaţiu între ele.&lt;br /&gt;
Scrieţi un program care să furnizeze codul de acces la seif.&lt;br /&gt;
== Date de intrare ==&lt;br /&gt;
&lt;br /&gt;
Fişierul de intrare &#039;&#039;&#039;cod3.in&#039;&#039;&#039; conţine pe prima linie numărul natural n, reprezentând numărul bileţelelor aflate în cutie. Pe următoarea linie a fişierului se află cele n numere scrise pe bileţele, separate prin câte un spaţiu.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Date de ieșire ==&lt;br /&gt;
&lt;br /&gt;
Dacă datele sunt introduse corect, pe ecran se va afișa: &amp;quot;Datele sunt introduse corect.&amp;quot; Fişierul de ieşire cod3.out va conţine pe prima linie numerele din care este compus codul, în ordine crescătoare şi fără spaţii între ele.&lt;br /&gt;
&lt;br /&gt;
În cazul în care datele nu respectă restricțiile, se va afișa: &amp;quot;Datele nu corespund restricțiilor impuse.&amp;quot;.&lt;br /&gt;
== Restricţii şi precizări ==&lt;br /&gt;
*&#039;&#039;&#039;1 ≤ n ≤ 90000&#039;&#039;&#039;&lt;br /&gt;
== Exemple ==&lt;br /&gt;
===Exemplul 1===&lt;br /&gt;
; &#039;&#039;cod3.in&#039;&#039;&lt;br /&gt;
:10&lt;br /&gt;
:11 3 11 11 12 2 11 12 3 11&lt;br /&gt;
; &#039;&#039;ecran&#039;&#039;&lt;br /&gt;
:Datele sunt introduse corect.&lt;br /&gt;
; &#039;&#039;cod3.out&#039;&#039;&lt;br /&gt;
:211&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Exemplul 2===&lt;br /&gt;
; &#039;&#039;cod3.in&#039;&#039;&#039;&lt;br /&gt;
:5&lt;br /&gt;
:2 3 2 3 4&lt;br /&gt;
; &#039;&#039;ecran&#039;&#039;&lt;br /&gt;
:Datele sunt introduse corect.&lt;br /&gt;
; &#039;&#039;cod3.out&#039;&#039;&lt;br /&gt;
:4&lt;br /&gt;
===Exemplul 3===&lt;br /&gt;
; &#039;&#039;cod3.in&#039;&#039;&#039;&lt;br /&gt;
:100000&lt;br /&gt;
:1 2 3&lt;br /&gt;
; &#039;&#039;ecran&#039;&#039;&lt;br /&gt;
:Datele nu corespund restricțiilor impuse.&lt;br /&gt;
; &#039;&#039;cod3.out&#039;&#039;&lt;br /&gt;
:&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Rezolvare == &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
# 2177 - Cod3&lt;br /&gt;
import sys&lt;br /&gt;
&lt;br /&gt;
def validate_data(n, nums):&lt;br /&gt;
    if not 1 &amp;lt;= n &amp;lt;= 90000:&lt;br /&gt;
        return False&lt;br /&gt;
    if len(nums) != n:&lt;br /&gt;
        return False&lt;br /&gt;
    for num in nums:&lt;br /&gt;
        if not 0 &amp;lt;= num &amp;lt;= 99:&lt;br /&gt;
            return False&lt;br /&gt;
    return True&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def solve_problem(n, nums):&lt;br /&gt;
    fr = [0] * 100&lt;br /&gt;
    for num in nums:&lt;br /&gt;
        fr[num] += 1&lt;br /&gt;
    code_nums = []&lt;br /&gt;
    for i in range(100):&lt;br /&gt;
        if fr[i] % 2 == 1:&lt;br /&gt;
            code_nums.append(i)&lt;br /&gt;
    return code_nums&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
if __name__ == &amp;quot;__main__&amp;quot;:&lt;br /&gt;
    with open(&amp;quot;cod3.in&amp;quot;) as fin, open(&amp;quot;cod3.out&amp;quot;, &amp;quot;w&amp;quot;) as fout:&lt;br /&gt;
        n = int(fin.readline().strip())&lt;br /&gt;
        nums = list(map(int, fin.readline().strip().split()))&lt;br /&gt;
        if validate_data(n, nums):&lt;br /&gt;
            print( &amp;quot;Datele sunt introduse corect.\n&amp;quot;)&lt;br /&gt;
            code_nums = solve_problem(n, nums)&lt;br /&gt;
            fout.write(&amp;quot;&amp;quot;.join(str(num) for num in code_nums))&lt;br /&gt;
        else:&lt;br /&gt;
            print(&amp;quot;Datele nu corespund restricțiilor impuse.&amp;quot;)&lt;br /&gt;
            sys.exit(0)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
            &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Explicatie==&lt;br /&gt;
&lt;br /&gt;
Funcția validate_data(n, nums):&lt;br /&gt;
&lt;br /&gt;
Această funcție primește două argumente: n, care reprezintă numărul de întregi, și nums, care este o listă de n întregi.&lt;br /&gt;
Funcția returnează True dacă datele de intrare respectă restricțiile impuse, și False în caz contrar.&lt;br /&gt;
Restricțiile verificate de această funcție sunt:&lt;br /&gt;
1 ≤ n ≤ 90000 - n trebuie să fie între 1 și 90000 (inclusiv).&lt;br /&gt;
0 ≤ nums[i] ≤ 99 - fiecare întreg din nums trebuie să fie între 0 și 99 (inclusiv).&lt;br /&gt;
Funcția folosește o simplă declarație if pentru a verifica fiecare restricție, și returnează False dacă vreo restricție este încălcată. Dacă toate restricțiile sunt respectate, funcția returnează True.&lt;br /&gt;
Funcția solve_problem(n, nums):&lt;br /&gt;
&lt;br /&gt;
Această funcție primește două argumente: n, care reprezintă numărul de întregi, și nums, care este o listă de n întregi.&lt;br /&gt;
Funcția returnează o listă de întregi care reprezintă codul.&lt;br /&gt;
Funcția începe prin a crea o listă fr de 100 de întregi, inițializați cu 0. Această listă este folosită pentru a ține evidența de câte ori apare fiecare întreg între 0 și 99 în nums.&lt;br /&gt;
Funcția apoi parcurge întreaga listă nums și incrementează elementul corespunzător din lista fr.&lt;br /&gt;
Funcția în cele din urmă parcurge întreaga listă de întregi între 0 și 99 și adaugă orice întreg în lista cod dacă acesta apare de un număr impar de ori în nums.&lt;br /&gt;
Funcția returnează lista cod.&lt;br /&gt;
Blocul if __name__ == &amp;quot;__main__&amp;quot;:&lt;br /&gt;
&lt;br /&gt;
Acest bloc de cod este executat atunci când scriptul este rulat ca program principal.&lt;br /&gt;
Blocul citește datele de intrare din fișierul cod3.in.&lt;br /&gt;
Blocul apoi apelează funcția validate_data(n, nums) pentru a verifica dacă datele de intrare sunt valide. Dacă datele de intrare sunt invalide, blocul scrie &amp;quot;Datele nu corespund restricțiilor impuse.&amp;quot; în fișierul de ieșire și oprește programul folosind sys.exit(0).&lt;br /&gt;
Dacă datele de intrare sunt valide, blocul scrie &amp;quot;Datele sunt introduse corect.&amp;quot; în fișierul de ieșire și apelează funcția solve_problem(n, nums) pentru a rezolva problema.&lt;/div&gt;</summary>
		<author><name>Sovago Rares-Andrei</name></author>
	</entry>
	<entry>
		<id>https://wiki.universitas.ro/index.php?title=3382_-_robot2&amp;diff=5305</id>
		<title>3382 - robot2</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=3382_-_robot2&amp;diff=5305"/>
		<updated>2023-04-29T07:17:54Z</updated>

		<summary type="html">&lt;p&gt;Sovago Rares-Andrei: Pagină nouă: == Cerinţa == Robotul Vasile s-a angajat la o fabrică de bomboane. El trebuie să ambaleze bomboanele în cutii. Toate bomboanele au formă dreptunghiulară. Două bomboane sunt de tipuri distincte dacă diferă prin cel puţin una dintre dimensiunile laturilor lor. Robotul determină dimensiunile bomboanelor (exprimate în milimetri) şi trebuie să ambaleze bomboanele în cutii astfel încât în orice cutie să existe exact câte o bomboană de fiecare tip. Scrieţi un p...&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Cerinţa ==&lt;br /&gt;
Robotul Vasile s-a angajat la o fabrică de bomboane. El trebuie să ambaleze bomboanele în cutii. Toate bomboanele au formă dreptunghiulară. Două bomboane sunt de tipuri distincte dacă diferă prin cel puţin una dintre dimensiunile laturilor lor. Robotul determină dimensiunile bomboanelor (exprimate în milimetri) şi trebuie să ambaleze bomboanele în cutii astfel încât în orice cutie să existe exact câte o bomboană de fiecare tip.&lt;br /&gt;
Scrieţi un program care citeşte dimensiunile bomboanelor şi rezolvă următoarele două cerinţe:&lt;br /&gt;
1. determină numărul de tipuri distincte de bomboane;&lt;br /&gt;
2. determină numărul maxim de cutii de bomboane pe care robotul Vasile le poate obţine din bomboanele existente, respectând condiţiile din enunţ.&lt;br /&gt;
== Date de intrare ==&lt;br /&gt;
Fișierul de intrare &#039;&#039;&#039;robot.in&#039;&#039;&#039; conţine pe prima linie cerinţa &#039;&#039;&#039;c&#039;&#039;&#039; care trebuie să fie rezolvată (1 sau 2). Pe a doua linie se află numărul natural &#039;&#039;&#039;n&#039;&#039;&#039;, reprezentând numărul de bomboane. Pe următoarele n linii se află dimensiunile bomboanelor, câte o bomboană pe o linie; o linie care descrie o bomboană conţine două numere naturale separate printr-un spaţiu &#039;&#039;&#039;lg1 lg2&#039;&#039;&#039;, reprezentând lungimile laturilor bomboanei.&lt;br /&gt;
== Date de ieșire == &lt;br /&gt;
Dacă datele sunt introduse corect, pe ecran: &lt;br /&gt;
&amp;quot;Datele sunt introduse corect.&amp;quot;,fișierul de ieșire &#039;&#039;&#039;robot.out&#039;&#039;&#039; va conţine o singură linie pe care va fi scris un număr natural determinat conform cerinţei &#039;&#039;&#039;c&#039;&#039;&#039;. În cazul în care datele nu respectă restricțiile, se va afișa: &amp;quot;Datele nu corespund restricțiilor impuse.&amp;quot;.&lt;br /&gt;
== Restricţii şi precizări ==&lt;br /&gt;
*2 ≤ n ≤ 500 000&lt;br /&gt;
*0 &amp;lt; lg1, lg2 &amp;lt; 100&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
== Exemple ==&lt;br /&gt;
===Exemplul 1===&lt;br /&gt;
; &#039;&#039;robot.in&#039;&#039;&lt;br /&gt;
:1&lt;br /&gt;
:7&lt;br /&gt;
:1 2&lt;br /&gt;
:3 4&lt;br /&gt;
:2 1&lt;br /&gt;
:3 4&lt;br /&gt;
:5 6&lt;br /&gt;
:3 4&lt;br /&gt;
:5 6&lt;br /&gt;
; &#039;&#039;Ecran&#039;&#039;&lt;br /&gt;
: Datele sunt introduse corect.&lt;br /&gt;
; &#039;&#039;robot.out&#039;&#039;&lt;br /&gt;
:3&lt;br /&gt;
=== Exemplul 2 ===&lt;br /&gt;
; &#039;&#039;robot.in&#039;&#039;&lt;br /&gt;
:2&lt;br /&gt;
:7&lt;br /&gt;
:1 2&lt;br /&gt;
:3 4&lt;br /&gt;
:2 1&lt;br /&gt;
:3 4&lt;br /&gt;
:5 6&lt;br /&gt;
:3 4&lt;br /&gt;
:5 6&lt;br /&gt;
; &#039;&#039;Ecran&#039;&#039;&lt;br /&gt;
:  Datele sunt introduse corect.&lt;br /&gt;
:&#039;&#039;robot.out&#039;&#039;&lt;br /&gt;
:2&lt;br /&gt;
===Exemplul 3===&lt;br /&gt;
; &#039;&#039;robot.in&#039;&#039;&lt;br /&gt;
:30&lt;br /&gt;
:10&lt;br /&gt;
:1 2&lt;br /&gt;
:3 4&lt;br /&gt;
:-1 5&lt;br /&gt;
:6 7&lt;br /&gt;
:8 9&lt;br /&gt;
:10 11&lt;br /&gt;
:12 13&lt;br /&gt;
:14 15&lt;br /&gt;
:16 17&lt;br /&gt;
:18 19&lt;br /&gt;
; &#039;&#039;Ecran&#039;&#039;&lt;br /&gt;
: Datele sunt introduse corect.&lt;br /&gt;
:&#039;&#039;robot.out&#039;&#039;&#039;&lt;br /&gt;
:nu exista&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Rezolvare == &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
# 3382 - robot2&lt;br /&gt;
from typing import Tuple, List&lt;br /&gt;
&lt;br /&gt;
def validare_date(cerinta: int, nr_bomboane: int, dimensiuni_bomboane: List[Tuple[int, int]]) -&amp;gt; bool:&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    Verifică dacă datele de intrare corespund constrângerilor problemei.&lt;br /&gt;
    Returnează True dacă datele sunt valide și False altfel.&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    if not (1 &amp;lt;= cerinta &amp;lt;= 2):&lt;br /&gt;
        return False&lt;br /&gt;
    if not (2 &amp;lt;= nr_bomboane &amp;lt;= 500000):&lt;br /&gt;
        return False&lt;br /&gt;
    for x, y in dimensiuni_bomboane:&lt;br /&gt;
        if not (0 &amp;lt; x &amp;lt; 100 and 0 &amp;lt; y &amp;lt; 100):&lt;br /&gt;
            return False&lt;br /&gt;
    return True&lt;br /&gt;
&lt;br /&gt;
def rezolvare_problema(cerinta: int, nr_bomboane: int, dimensiuni_bomboane: List[Tuple[int, int]]) -&amp;gt; int:&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    Rezolvă problema pe baza datelor de intrare și returnează răspunsul.&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    bomboane_distincte = [0] * 10002&lt;br /&gt;
    for x, y in dimensiuni_bomboane:&lt;br /&gt;
        bomboane_distincte[min(x, y) * 100 + max(x, y)] += 1&lt;br /&gt;
    if cerinta == 1:&lt;br /&gt;
        nr_bomboane_distincte = sum(1 for i in range(100, 10002) if bomboane_distincte[i] != 0)&lt;br /&gt;
        return nr_bomboane_distincte&lt;br /&gt;
    else:&lt;br /&gt;
        nr_maxim_cutii = float(&#039;inf&#039;)&lt;br /&gt;
        for i in range(1, 10002):&lt;br /&gt;
            if bomboane_distincte[i] != 0 and bomboane_distincte[i] &amp;lt; nr_maxim_cutii:&lt;br /&gt;
                nr_maxim_cutii = bomboane_distincte[i]&lt;br /&gt;
        return nr_maxim_cutii&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
if __name__ == &#039;__main__&#039;:&lt;br /&gt;
    with open(&#039;robot.in&#039;, &#039;r&#039;) as f_in, open(&#039;robot.out&#039;, &#039;w&#039;) as f_out:&lt;br /&gt;
        cerinta = int(f_in.readline().strip())&lt;br /&gt;
        nr_bomboane = int(f_in.readline().strip())&lt;br /&gt;
        dimensiuni_bomboane = [tuple(map(int, line.strip().split())) for line in f_in.readlines()]&lt;br /&gt;
        if not validare_date(cerinta, nr_bomboane, dimensiuni_bomboane):&lt;br /&gt;
            print(&#039;Datele nu corespund restrictiilor impuse.&#039;)&lt;br /&gt;
            f_out.write(&#039;Datele nu corespund restrictiilor impuse.&#039;)&lt;br /&gt;
        else:&lt;br /&gt;
            print(&#039;Datele sunt introduse corect.&#039;)&lt;br /&gt;
            raspuns = rezolvare_problema(cerinta, nr_bomboane, dimensiuni_bomboane)&lt;br /&gt;
            f_out.write(str(raspuns))&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Explicatie==&lt;br /&gt;
Funcția validare_date(cerinta: int, nr_bomboane: int, dimensiuni_bomboane: List[Tuple[int, int]]) -&amp;gt; bool verifică dacă datele de intrare corespund constrângerilor problemei. Primeste ca parametrii cerinta (1 sau 2), numarul de bomboane si o lista cu dimensiunile bomboanelor. Verifică dacă cerinta este 1 sau 2, dacă numarul de bomboane este cuprins între 2 și 500000 și dacă dimensiunile bomboanelor sunt cuprinse între 0 și 99. Returnează True dacă datele sunt valide și False altfel.&lt;br /&gt;
&lt;br /&gt;
Funcția rezolvare_problema(cerinta: int, nr_bomboane: int, dimensiuni_bomboane: List[Tuple[int, int]]) -&amp;gt; int rezolvă problema pe baza datelor de intrare și returnează răspunsul. Primește aceleași parametrii ca și validare_date. Pentru cerinta 1, determină numărul de tipuri distincte de bomboane prin însumarea tuturor valorilor nenule din lista bomboane_distincte care reprezintă frecvențele cu care apar perechile de dimensiuni de bomboane distincte. Pentru cerinta 2, determină numărul maxim de cutii de bomboane pe care robotul Vasile le poate obține din bomboanele existente, respectând condițiile din enunț, prin determinarea celei mai mici frecvențe a unei perechi de dimensiuni de bomboane distincte care apar cel puțin o dată.&lt;br /&gt;
&lt;br /&gt;
Funcția main() este funcția principală care citește datele de intrare din fișierul robot.in, apelează funcțiile validare_date și rezolvare_problema, și afișează mesaje corespunzătoare în consolă și în fișierul robot.out în funcție de validitatea datelor de intrare și de răspunsul obținut.&lt;/div&gt;</summary>
		<author><name>Sovago Rares-Andrei</name></author>
	</entry>
	<entry>
		<id>https://wiki.universitas.ro/index.php?title=2809_-_Crescator_1&amp;diff=5303</id>
		<title>2809 - Crescator 1</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=2809_-_Crescator_1&amp;diff=5303"/>
		<updated>2023-04-29T07:02:22Z</updated>

		<summary type="html">&lt;p&gt;Sovago Rares-Andrei: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Cerinţa ==&lt;br /&gt;
Scrieți un program care citește un șir de cel mult &#039;&#039;&#039;10^6&#039;&#039;&#039; numere naturale din intervalul &#039;&#039;&#039;[0,10^9 ]&#039;&#039;&#039; ordonate crescător și determină cel mai mic număr din șir care apare de un număr impar de ori. Dacă în șir nu se află o astfel de valoare, se afișează mesajul &#039;&#039;&#039;nu exista&#039;&#039;&#039;.&lt;br /&gt;
== Date de intrare ==&lt;br /&gt;
Fișierul de intrare &#039;&#039;&#039;crescator1.in&#039;&#039;&#039; conține cel mult &#039;&#039;&#039;10^6&#039;&#039;&#039; numere naturale din intervalul &#039;&#039;&#039;[0,10^9]&#039;&#039;&#039;, ordonate crescător, separate prin spații.&lt;br /&gt;
== Date de ieșire == &lt;br /&gt;
Dacă datele sunt introduse corect, pe ecran: &lt;br /&gt;
&amp;quot;Datele sunt introduse corect.&amp;quot;,fișierul de ieșire &#039;&#039;&#039;crescator1.out&#039;&#039;&#039; va conține pe prima linie cel mai mic număr din fișierul de intrare care apare de un număr impar de ori sau mesajul nu exista dacă în fișier nu se află o astfel de valoare. În cazul în care datele nu respectă restricțiile, se va afișa: &amp;quot;Datele nu corespund restricțiilor impuse.&amp;quot;.&lt;br /&gt;
== Restricţii şi precizări ==&lt;br /&gt;
*Proiectați un algoritm eficient din punctul de vedere al spațiului de memorie utilizat şi al timpului de executare:&lt;br /&gt;
*se recomandă o soluție care să nu memoreze elementele șirului într-un tablou sau altă structură de date similară.&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
== Exemple ==&lt;br /&gt;
===Exemplul 1===&lt;br /&gt;
; &#039;&#039;crescator1.in&#039;&#039;&lt;br /&gt;
:5 5 8 8 8 8 20 20 20 34 54 54 65 65 65&lt;br /&gt;
; &#039;&#039;Ecran&#039;&#039;&lt;br /&gt;
: Datele sunt introduse corect.&lt;br /&gt;
; &#039;&#039;crescator1.out&#039;&#039;&lt;br /&gt;
:20&lt;br /&gt;
=== Exemplul 2 ===&lt;br /&gt;
; &#039;&#039;crescator1.in&#039;&#039;&lt;br /&gt;
:4 1 1 1 2&lt;br /&gt;
; &#039;&#039;secventeneuniforme.out&#039;&#039;&lt;br /&gt;
; &#039;&#039;Ecran&#039;&#039;&lt;br /&gt;
: Datele nu corespund restrictiilor impuse.&lt;br /&gt;
:0&lt;br /&gt;
===Exemplul 3===&lt;br /&gt;
; &#039;&#039;crescator1.in&#039;&#039;&lt;br /&gt;
:3 3 3 3&lt;br /&gt;
; &#039;&#039;Ecran&#039;&#039;&lt;br /&gt;
: Datele sunt introduse corect.&lt;br /&gt;
; &#039;&#039;crescator1.out&#039;&#039;&lt;br /&gt;
:nu exista&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Rezolvare == &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
# 2809 - Crescator 1&lt;br /&gt;
def validare_date(sir):&lt;br /&gt;
    if len(sir) &amp;gt; 10 ** 6:&lt;br /&gt;
        return False&lt;br /&gt;
    for i in range(1, len(sir)):&lt;br /&gt;
        if sir[i] &amp;lt; sir[i - 1]:&lt;br /&gt;
            return False&lt;br /&gt;
    return True&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def numar_impar(sir):&lt;br /&gt;
    i = 0&lt;br /&gt;
    while i &amp;lt; len(sir):&lt;br /&gt;
        j = i&lt;br /&gt;
        while j &amp;lt; len(sir) and sir[j] == sir[i]:&lt;br /&gt;
            j += 1&lt;br /&gt;
        if (j - i) % 2 == 1:&lt;br /&gt;
            return sir[i]&lt;br /&gt;
        i = j&lt;br /&gt;
    return None&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
if __name__ == &#039;__main__&#039;:&lt;br /&gt;
    with open(&amp;quot;crescator1.in&amp;quot;) as fin:&lt;br /&gt;
        sir = [int(x) for x in fin.readline().split()]&lt;br /&gt;
        if validare_date(sir):&lt;br /&gt;
            rezultat = numar_impar(sir)&lt;br /&gt;
            with open(&amp;quot;crescator1.out&amp;quot;, &amp;quot;w&amp;quot;) as fout:&lt;br /&gt;
                if rezultat is not None:&lt;br /&gt;
                    fout.write(str(rezultat))&lt;br /&gt;
                else:&lt;br /&gt;
                    fout.write(&amp;quot;nu exista&amp;quot;)&lt;br /&gt;
                print(&amp;quot;Datele introduse sunt corecte.&amp;quot;)&lt;br /&gt;
        else:&lt;br /&gt;
            print(&amp;quot;Datele nu corespund restricțiilor impuse.&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Explicatie==&lt;br /&gt;
Funcția validare_date(sir) verifică dacă datele din fișierul de intrare corespund restricțiilor impuse, adică lungimea șirului nu depășește 10^6 și toate numerele din șir sunt în ordine crescătoare. Dacă datele sunt valide, funcția returnează True, altfel returnează False.&lt;br /&gt;
&lt;br /&gt;
Funcția numar_impar(sir) primește un șir de numere și încearcă să găsească un număr impar care apare de un număr impar de ori în șir. Pentru a face acest lucru, funcția parcurge lista și caută fiecare secvență de numere consecutive egale. Dacă numărul de elemente din această secvență este impar, atunci numărul respectiv este găsit și funcția returnează acesta. Dacă nu există niciun număr care să apară de un număr impar de ori, funcția returnează None.&lt;br /&gt;
&lt;br /&gt;
În blocul if __name__ == &#039;__main__&#039;: citim datele de intrare din fișierul &amp;quot;crescator1.in&amp;quot; și apoi verificăm dacă datele sunt valide folosind funcția validare_date(sir). Dacă datele nu sunt valide, se afișează un mesaj corespunzător și se oprește execuția programului.&lt;br /&gt;
&lt;br /&gt;
Dacă datele sunt valide, se apelează funcția numar_impar(sir) pentru a găsi un număr impar care apare de un număr impar de ori și se afișează mesajul &amp;quot;Datele introduse sunt corecte.&amp;quot;. În plus, se scrie numărul găsit (dacă există) în fișierul de ieșire &amp;quot;crescator1.out&amp;quot;. Dacă nu există niciun număr care să apară de un număr impar de ori, se scrie &amp;quot;nu exista&amp;quot; în fișierul de ieșire.&lt;/div&gt;</summary>
		<author><name>Sovago Rares-Andrei</name></author>
	</entry>
</feed>