<?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=RebecaBud</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=RebecaBud"/>
	<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/wiki/Special:Contributions/RebecaBud"/>
	<updated>2026-06-17T09:24:57Z</updated>
	<subtitle>User contributions</subtitle>
	<generator>MediaWiki 1.42.1</generator>
	<entry>
		<id>https://wiki.universitas.ro/index.php?title=3044_-_Comun_1&amp;diff=10059</id>
		<title>3044 - Comun 1</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=3044_-_Comun_1&amp;diff=10059"/>
		<updated>2024-06-03T17:53:09Z</updated>

		<summary type="html">&lt;p&gt;RebecaBud: Pagină nouă: == Enunt == Tocmai ai primit un șir v de K numere naturale nenule distincte. Plecând de la acest șir, te-ai gândit să construiești un șir w de N numere naturale distincte, astfel încât un număr x este în șirul w dacă și numai dacă exista inițial în șirul v sau se pot alege cel puțin două numere din șirul v astfel încât x este cel mai mare divizor comun al acelor numere. De exemplu, dacă v = {4, 6, 7} atunci w = {1, 2, 4, 6, 7}. Uimit de proprietățile...&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Enunt ==&lt;br /&gt;
Tocmai ai primit un șir v de K numere naturale nenule distincte. Plecând de la acest șir, te-ai gândit să construiești un șir w de N numere naturale distincte, astfel încât un număr x este în șirul w dacă și numai dacă exista inițial în șirul v sau se pot alege cel puțin două numere din șirul v astfel încât x este cel mai mare divizor comun al acelor numere. De exemplu, dacă v = {4, 6, 7} atunci w = {1, 2, 4, 6, 7}.&lt;br /&gt;
Uimit de proprietățile matematice frumoase ale noului șir w, ai uitat din păcate șirul original v de la care ai pornit.&lt;br /&gt;
== Cerinţa ==&lt;br /&gt;
Dându-se șirul w, să se găsească un șir posibil inițial v având un număr minim de elemente.&lt;br /&gt;
== Date de intrare ==&lt;br /&gt;
Fișierul de intrare comun.in conține pe prima linie un număr natural N. Pe cea de-a doua linie se află N numere naturale nenule distincte, în ordine strict crescătoare, reprezentând șirul w.&lt;br /&gt;
== Date de ieșire ==&lt;br /&gt;
Fișierul de ieșire comun.out va conține pe prima linie numărul minim K de elemente ale șirului v. Pe cea de-a doua linie se vor afla K numere naturale distincte, în ordine strict crescătoare, reprezentând șirul propriu-zis.&lt;br /&gt;
== Restricţii şi precizări ==&lt;br /&gt;
* Toate valorile din fișierul de intrare sunt numere naturale nenule mai mici sau egale cu 100.000.&lt;br /&gt;
* Pentru teste în valoare de 15 puncte, toate valorile din fișierul de intrare sunt mai mici sau egale cu 20.&lt;br /&gt;
* Pentru teste în valoare de 50 de puncte, toate valorile din fișierul de intrare sunt mai mici sau egale cu 2000.&lt;br /&gt;
* Se garantează că există măcar o soluție.&lt;br /&gt;
* Dacă există mai multe șiruri inițiale cu număr minim de elemente, oricare este acceptat.&lt;br /&gt;
== Exemplul 1 ==&lt;br /&gt;
; comun.in&lt;br /&gt;
&lt;br /&gt;
  5&lt;br /&gt;
  1 2 4 6 7&lt;br /&gt;
; comun.out&lt;br /&gt;
&lt;br /&gt;
  3&lt;br /&gt;
  4 6 7&lt;br /&gt;
== Explicație ==&lt;br /&gt;
1 = cmmdc(6, 7) = cmmdc(4, 6, 7). 2 = cmmdc(4, 6). Se poate demonstra că orice alt șir cu proprietatea cerută are măcar 3 elemente.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Exemplul 2 ==&lt;br /&gt;
; comun.in&lt;br /&gt;
&lt;br /&gt;
  4&lt;br /&gt;
  2 4 8 16&lt;br /&gt;
; comun.out&lt;br /&gt;
&lt;br /&gt;
  4&lt;br /&gt;
  2 4 8 16&lt;br /&gt;
== Explicație ==&lt;br /&gt;
Nu există niciun șir de mai puțin de 4 elemente cu proprietatea cerută.&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;gt;&lt;br /&gt;
def gcd(a, b):&lt;br /&gt;
    while b:&lt;br /&gt;
        a, b = b, a % b&lt;br /&gt;
    return a&lt;br /&gt;
&lt;br /&gt;
def find_initial_sequence(w):&lt;br /&gt;
    n = len(w)&lt;br /&gt;
    initial_sequence = []&lt;br /&gt;
    initial_sequence.append(w[0])&lt;br /&gt;
    for i in range(1, n):&lt;br /&gt;
        current_gcd = gcd(initial_sequence[-1], w[i])&lt;br /&gt;
        if current_gcd != w[i]:&lt;br /&gt;
            initial_sequence.append(w[i])&lt;br /&gt;
    return initial_sequence&lt;br /&gt;
&lt;br /&gt;
def main():&lt;br /&gt;
    with open(&amp;quot;comun.in&amp;quot;, &amp;quot;r&amp;quot;) as f:&lt;br /&gt;
        n = int(f.readline())&lt;br /&gt;
        w = list(map(int, f.readline().split()))&lt;br /&gt;
&lt;br /&gt;
    initial_sequence = find_initial_sequence(w)&lt;br /&gt;
&lt;br /&gt;
    with open(&amp;quot;comun.out&amp;quot;, &amp;quot;w&amp;quot;) as f:&lt;br /&gt;
        f.write(str(len(initial_sequence)) + &amp;quot;\n&amp;quot;)&lt;br /&gt;
        f.write(&amp;quot; &amp;quot;.join(map(str, initial_sequence)))&lt;br /&gt;
&lt;br /&gt;
if __name__ == &amp;quot;__main__&amp;quot;:&lt;br /&gt;
    main()&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>RebecaBud</name></author>
	</entry>
	<entry>
		<id>https://wiki.universitas.ro/index.php?title=3047_-_Fibo_Frac&amp;diff=10058</id>
		<title>3047 - Fibo Frac</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=3047_-_Fibo_Frac&amp;diff=10058"/>
		<updated>2024-06-03T17:50:47Z</updated>

		<summary type="html">&lt;p&gt;RebecaBud: Pagină nouă: == Enunt == Fie șirul Fibonacci dat prin F1 = 1, F2 = 1 și relația de recurență Fk = Fk-1 + Fk-2, k ≥ 3. Se consideră un număr natural N. == Cerinţa == Să se scrie un program care determină numărul F al fracțiilor diferite ireductibile subunitare, ce se pot forma utilizând primii N termeni ai șirului Fibonacci. == Date de intrare == Fișierul de intrare fibofrac.in conține pe prima linie numărul N. == Date de ieșire == Fișierul de ieșire fibofrac.out va c...&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Enunt ==&lt;br /&gt;
Fie șirul Fibonacci dat prin F1 = 1, F2 = 1 și relația de recurență Fk = Fk-1 + Fk-2, k ≥ 3. Se consideră un număr natural N.&lt;br /&gt;
== Cerinţa ==&lt;br /&gt;
Să se scrie un program care determină numărul F al fracțiilor diferite ireductibile subunitare, ce se pot forma utilizând primii N termeni ai șirului Fibonacci.&lt;br /&gt;
== Date de intrare ==&lt;br /&gt;
Fișierul de intrare fibofrac.in conține pe prima linie numărul N.&lt;br /&gt;
== Date de ieșire ==&lt;br /&gt;
Fișierul de ieșire fibofrac.out va conține pe prima linie numărul F, cu semnificația de mai sus.&lt;br /&gt;
== Restricţii şi precizări ==&lt;br /&gt;
* Pentru teste în valoare de 24 puncte, 0 &amp;lt; N &amp;lt; 80&lt;br /&gt;
* Pentru teste în valoare de 40 puncte, 0 &amp;lt; N &amp;lt; 1101&lt;br /&gt;
* Pentru teste în valoare de 56 puncte, 0 &amp;lt; N &amp;lt; 50001&lt;br /&gt;
* Pentru teste în valoare de 100 puncte, 0 &amp;lt; N &amp;lt; 1.000.000&lt;br /&gt;
* Două fracții ireductibile a / b și c / d sunt diferite dacă a ≠ c sau b ≠ d.&lt;br /&gt;
* 0 ≤ F &amp;lt; 2^63&lt;br /&gt;
== Exemplul 1 ==&lt;br /&gt;
; fibofrac.in&lt;br /&gt;
&lt;br /&gt;
  7&lt;br /&gt;
; fibofrac.out&lt;br /&gt;
&lt;br /&gt;
  14&lt;br /&gt;
== Explicație ==&lt;br /&gt;
N = 7; Primii 7 termeni ai șirului Fibonacci sunt: 1, 1, 2, 3, 5, 8, 13. Se pot forma 14 fracții diferite ireductibile subunitare: 1/2, 1/3, 1/5, 1/8, 1/13, 2/3, 2/5, 2/13, 3/5, 3/8, 3/13, 5/8, 5/13, 8/13.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Exemplul 2 ==&lt;br /&gt;
; fibofrac.in&lt;br /&gt;
&lt;br /&gt;
  2019&lt;br /&gt;
; fibofrac.out&lt;br /&gt;
&lt;br /&gt;
  1547722&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Exemplul 3 ==&lt;br /&gt;
; fibofrac.in&lt;br /&gt;
&lt;br /&gt;
  500000&lt;br /&gt;
; fibofrac.out&lt;br /&gt;
&lt;br /&gt;
  94988288219&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;gt;&lt;br /&gt;
def gcd(a, b):&lt;br /&gt;
    while b:&lt;br /&gt;
        a, b = b, a % b&lt;br /&gt;
    return a&lt;br /&gt;
&lt;br /&gt;
def count_fibonacci_fractions(n):&lt;br /&gt;
    fib = [1, 1]&lt;br /&gt;
    for i in range(2, n):&lt;br /&gt;
        fib.append(fib[i - 1] + fib[i - 2])&lt;br /&gt;
    &lt;br /&gt;
    count = 0&lt;br /&gt;
    for i in range(n):&lt;br /&gt;
        for j in range(i + 1, n):&lt;br /&gt;
            if gcd(fib[i], fib[j]) == 1:&lt;br /&gt;
                count += 1&lt;br /&gt;
    return count&lt;br /&gt;
&lt;br /&gt;
def main():&lt;br /&gt;
    with open(&amp;quot;fibofrac.in&amp;quot;, &amp;quot;r&amp;quot;) as f_in:&lt;br /&gt;
        n = int(f_in.readline().strip())&lt;br /&gt;
    &lt;br /&gt;
    result = count_fibonacci_fractions(n)&lt;br /&gt;
    &lt;br /&gt;
    with open(&amp;quot;fibofrac.out&amp;quot;, &amp;quot;w&amp;quot;) as f_out:&lt;br /&gt;
        f_out.write(str(result))&lt;br /&gt;
&lt;br /&gt;
if __name__ == &amp;quot;__main__&amp;quot;:&lt;br /&gt;
    main()&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>RebecaBud</name></author>
	</entry>
	<entry>
		<id>https://wiki.universitas.ro/index.php?title=3091_-_Pavele&amp;diff=10057</id>
		<title>3091 - Pavele</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=3091_-_Pavele&amp;diff=10057"/>
		<updated>2024-06-03T17:48:09Z</updated>

		<summary type="html">&lt;p&gt;RebecaBud: Pagină nouă:  == Cerinţa == Avem o suprafață dreptunghiulară pătratică de dimensiune  n x n (n – impar). Colțul de dimensiune 1 x 1 din stânga-sus lipsește. Se dorește pavarea a cât mai mult din suprafața sa cu dale de dimensiune 1 x 2 (sau 2 x 1). Trebuie folosite cât mai multe dale și în plus, numărul de dale orizontale folosite trebuie să fie egal cu numărul de dale verticale folosite pentru pavare. == Date de intrare == Fișierul de intrare pavele.in conține pe pr...&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
== Cerinţa ==&lt;br /&gt;
Avem o suprafață dreptunghiulară pătratică de dimensiune  n x n (n – impar). Colțul de dimensiune 1 x 1 din stânga-sus lipsește. Se dorește pavarea a cât mai mult din suprafața sa cu dale de dimensiune 1 x 2 (sau 2 x 1). Trebuie folosite cât mai multe dale și în plus, numărul de dale orizontale folosite trebuie să fie egal cu numărul de dale verticale folosite pentru pavare.&lt;br /&gt;
== Date de intrare ==&lt;br /&gt;
Fișierul de intrare pavele.in conține pe prima linie numărul n.&lt;br /&gt;
== Date de ieșire ==&lt;br /&gt;
Fișierul de ieșire pavele.out conține pe prima linie un număr r, ce reprezintă numărul de dale verticale (orizontale) folosite. Următoarele n linii conțin câte n numere întregi, separate printr-un spațiu, reprezentând codificarea modului de pavare. Numerele trebuie să fie cuprinse între –r și r. Valoarea 0 semnifică faptul că acea poziție a zonei dreptunghiulare nu se pavează (sau lipsește, întrucât se afișează 0 și în contul colțului stânga sus).&lt;br /&gt;
Pentru codificarea dalelor orizontale se folosesc câte două numere egale, cuprinse între 1 și r, așezate unul lângă altul pe aceeași linie iar pentru codificarea dalelor verticale se folosesc câte două numere egale cuprinse, cuprinse între –r și -1, așezate unul sub altul.&lt;br /&gt;
== Restricţii şi precizări ==&lt;br /&gt;
* 5 ≤ n ≤ 299&lt;br /&gt;
* n – impar;&lt;br /&gt;
* dalele orizontale se codifică folosind valori pozitive iar cele verticale folosind valori negative;&lt;br /&gt;
* evident, dalele nu se pot suprapune și trebuie să fie complet incluse în zona dreptunghiulară;&lt;br /&gt;
== Exemplul 1 ==&lt;br /&gt;
; pavele.in&lt;br /&gt;
&lt;br /&gt;
  5&lt;br /&gt;
; pavele.out&lt;br /&gt;
&lt;br /&gt;
  6&lt;br /&gt;
   0   1   1 -1 -2&lt;br /&gt;
   3  -4  -5 -1 -2&lt;br /&gt;
  -3  -4  -5  4  4&lt;br /&gt;
   2   2  -6  5  5&lt;br /&gt;
   3   3  -6  6  6&lt;br /&gt;
  Aici datele sunt indentate doar pentru o mai ușoară înțelegere a exemplului.&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;gt;&lt;br /&gt;
def write_output(file_name, r, pave_layout):&lt;br /&gt;
    with open(file_name, &#039;w&#039;) as file:&lt;br /&gt;
        file.write(str(r) + &#039;\n&#039;)&lt;br /&gt;
        for row in pave_layout:&lt;br /&gt;
            file.write(&#039; &#039;.join(map(str, row)) + &#039;\n&#039;)&lt;br /&gt;
&lt;br /&gt;
def pave_surface(n):&lt;br /&gt;
    pave_layout = [[0] * n for _ in range(n)]&lt;br /&gt;
    r = n // 2 + 1&lt;br /&gt;
    for i in range(n):&lt;br /&gt;
        for j in range(n):&lt;br /&gt;
            if (i + j) % 2 == 0:&lt;br /&gt;
                pave_layout[i][j] = r&lt;br /&gt;
            else:&lt;br /&gt;
                pave_layout[i][j] = -r&lt;br /&gt;
    return r, pave_layout&lt;br /&gt;
&lt;br /&gt;
def main():&lt;br /&gt;
    with open(&amp;quot;pavele.in&amp;quot;, &#039;r&#039;) as file:&lt;br /&gt;
        n = int(file.readline().strip())&lt;br /&gt;
    r, pave_layout = pave_surface(n)&lt;br /&gt;
    write_output(&amp;quot;pavele.out&amp;quot;, r, pave_layout)&lt;br /&gt;
&lt;br /&gt;
if __name__ == &amp;quot;__main__&amp;quot;:&lt;br /&gt;
    main()&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>RebecaBud</name></author>
	</entry>
	<entry>
		<id>https://wiki.universitas.ro/index.php?title=3924_-_Cripto_1&amp;diff=10056</id>
		<title>3924 - Cripto 1</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=3924_-_Cripto_1&amp;diff=10056"/>
		<updated>2024-06-03T17:46:23Z</updated>

		<summary type="html">&lt;p&gt;RebecaBud: Pagină nouă: == Enunt == Se dă un limbaj format din N cuvinte și un text criptat format din M cuvinte. Spunem că un cuvânt se permută după un șir x1,x2,…,xK dacă prima literă se permută cu x1, a doua cu x2, …, iar ultima cu xK. De exemplu, după șirul 1 5 6, “abc” devine “bgi”. Permutarea se face în ordinea literelor mici din alfabetul englez. Dacă o literă ar trece de finalul alfabetului, aceasta îl reia și apoi permută și litera următoare cu 1. În cazul...&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Enunt ==&lt;br /&gt;
Se dă un limbaj format din N cuvinte și un text criptat format din M cuvinte. Spunem că un cuvânt se permută după un șir x1,x2,…,xK dacă prima literă se permută cu x1, a doua cu x2, …, iar ultima cu xK.&lt;br /&gt;
De exemplu, după șirul 1 5 6, “abc” devine “bgi”. Permutarea se face în ordinea literelor mici din alfabetul englez. Dacă o literă ar trece de finalul alfabetului, aceasta îl reia și apoi permută și litera următoare cu 1.&lt;br /&gt;
În cazul în care ultima literă trece de finalul alfabetului, atunci cuvântul devine invalid. De exemplu, “zza” permutat după șirul 1 2 3, devine “ace”. (adunarea se face cu transport pornind de la stânga). Dacă “zzz” s-ar permuta după șirul 1 2 3, ar deveni invalid. Cele mai “semnificative” litere sunt de la dreapta la stânga.&lt;br /&gt;
Vrem să decriptăm textul, folosind mai multe variante de șiruri pe care le considerăm valabile. Cel mai bun șir de decriptare este acela pentru care numărul de cuvinte din textul criptat care se găsesc, după operație, în limbaj, este maximal.&lt;br /&gt;
== Cerinţa ==&lt;br /&gt;
Să se determine șirul cel mai bun de decriptare, dintre cele date. În cazul în care există mai multe astfel de șiruri, se va afișa cel cu indicele cel mai mic.&lt;br /&gt;
== Date de intrare ==&lt;br /&gt;
Pe prima linie din fișierul cripto1.in se află patru numere naturale N, M, K, Q.&lt;br /&gt;
Pe următoarea linie, se găsește limbajul, format din cele N cuvinte de lungime K.&lt;br /&gt;
Pe a treia linie se găsesc cele M cuvinte.&lt;br /&gt;
În final, se găsesc cele Q șiruri, de câte K numere fiecare pe câte o linie.&lt;br /&gt;
== Date de ieșire ==&lt;br /&gt;
Fişierul de ieşire cripto1.out va conţine pe prima linie, indicele celui mai bun șir, și similitudinea acestuia.&lt;br /&gt;
== Restricţii şi precizări ==&lt;br /&gt;
* N, M, Q ≤ 105, M * Q ≤ 107&lt;br /&gt;
*  Valorile din șiruri sunt strict mai mici decât 26.&lt;br /&gt;
* Pentru 30% din tese N, M, Q ≤ 100.&lt;br /&gt;
* K ≤ 12. Pentru alte 20% din teste K ≤ 3.&lt;br /&gt;
== Exemplul 1 ==&lt;br /&gt;
; cripto1.in&lt;br /&gt;
&lt;br /&gt;
  6 3 4 2 &lt;br /&gt;
  info olte niaa este inva lcea &lt;br /&gt;
  hlck njqa hlcj &lt;br /&gt;
  1 2 3 5  &lt;br /&gt;
  1 2 3 4 &lt;br /&gt;
; cripto1.out&lt;br /&gt;
&lt;br /&gt;
  2 2&lt;br /&gt;
== Explicație ==&lt;br /&gt;
Se permută cuvintele de pe a doua linie, după fiecare șir, din cele două.&lt;br /&gt;
Răspunsul este al doilea șir, 1 2 3 4, pentru că input-ul devine info olte infn.&lt;br /&gt;
Astfel, 2 dintre cuvinte se găsesc în primul limbaj.&lt;br /&gt;
Dacă am folosi primul șir, rezultatul ar fi 1: infp oltf info.&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;gt;&lt;br /&gt;
def decrypt_text(language, encrypted_text, permutation):&lt;br /&gt;
    decrypted_text = []&lt;br /&gt;
    for word in encrypted_text:&lt;br /&gt;
        decrypted_word = &amp;quot;&amp;quot;&lt;br /&gt;
        for i in range(len(word)):&lt;br /&gt;
            decrypted_word += language[word[i] - 1]&lt;br /&gt;
        decrypted_text.append(decrypted_word)&lt;br /&gt;
    decrypted_text_permuted = []&lt;br /&gt;
    for word in decrypted_text:&lt;br /&gt;
        permuted_word = &amp;quot;&amp;quot;&lt;br /&gt;
        for i in range(len(word)):&lt;br /&gt;
            permuted_word += word[permutation[i] - 1]&lt;br /&gt;
        decrypted_text_permuted.append(permuted_word)&lt;br /&gt;
    return decrypted_text_permuted&lt;br /&gt;
&lt;br /&gt;
def similarity(language, decrypted_text):&lt;br /&gt;
    count = 0&lt;br /&gt;
    for word in decrypted_text:&lt;br /&gt;
        if word in language:&lt;br /&gt;
            count += 1&lt;br /&gt;
    return count&lt;br /&gt;
&lt;br /&gt;
def read_input(file_name):&lt;br /&gt;
    with open(file_name, &#039;r&#039;) as file:&lt;br /&gt;
        N, M, K, Q = map(int, file.readline().split())&lt;br /&gt;
        language = file.readline().split()&lt;br /&gt;
        encrypted_text = [file.readline().split()[0] for _ in range(M)]&lt;br /&gt;
        permutations = [list(map(int, file.readline().split())) for _ in range(Q)]&lt;br /&gt;
    return N, M, K, Q, language, encrypted_text, permutations&lt;br /&gt;
&lt;br /&gt;
def write_output(file_name, result):&lt;br /&gt;
    with open(file_name, &#039;w&#039;) as file:&lt;br /&gt;
        file.write(str(result[0]) + &#039; &#039; + str(result[1]))&lt;br /&gt;
&lt;br /&gt;
def find_best_decryption(N, M, K, Q, language, encrypted_text, permutations):&lt;br /&gt;
    max_similarity = -1&lt;br /&gt;
    best_permutation_index = -1&lt;br /&gt;
    for i in range(Q):&lt;br /&gt;
        decrypted_text = decrypt_text(language, encrypted_text, permutations[i])&lt;br /&gt;
        current_similarity = similarity(language, decrypted_text)&lt;br /&gt;
        if current_similarity &amp;gt; max_similarity:&lt;br /&gt;
            max_similarity = current_similarity&lt;br /&gt;
            best_permutation_index = i + 1&lt;br /&gt;
    return best_permutation_index, max_similarity&lt;br /&gt;
&lt;br /&gt;
def main():&lt;br /&gt;
    N, M, K, Q, language, encrypted_text, permutations = read_input(&amp;quot;cripto1.in&amp;quot;)&lt;br /&gt;
    result = find_best_decryption(N, M, K, Q, language, encrypted_text, permutations)&lt;br /&gt;
    write_output(&amp;quot;cripto1.out&amp;quot;, result)&lt;br /&gt;
&lt;br /&gt;
if __name__ == &amp;quot;__main__&amp;quot;:&lt;br /&gt;
    main()&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>RebecaBud</name></author>
	</entry>
	<entry>
		<id>https://wiki.universitas.ro/index.php?title=3399_-_Semarun&amp;diff=10055</id>
		<title>3399 - Semarun</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=3399_-_Semarun&amp;diff=10055"/>
		<updated>2024-06-03T17:44:25Z</updated>

		<summary type="html">&lt;p&gt;RebecaBud: /* Rezolvare */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Enunt ==&lt;br /&gt;
Pentru că este un bun sportiv și poate alerga constant cu x metri pe secundă, Gigel și-a propus să câștige competiția semarun. Această competiție începe la momentul 0 și constă în parcurgerea unui traseu de n metri, ce conține k semafoare.&lt;br /&gt;
Pentru fiecare semafor se cunosc:&lt;br /&gt;
- distanța la care este poziționat față de punctul de start, exprimată în metri – d;&lt;br /&gt;
- numărul de secunde pentru care acesta indică culoarea roșu – r;&lt;br /&gt;
- numărul de secunde pentru care acesta indică culoarea verde – v.&lt;br /&gt;
La începutul competiției toate semafoarele indică culoarea roșu, apoi alternează între roșu și verde. La întâlnirea unui semafor, participanții trebuie să aștepte dacă acesta este roșu sau își schimbă culoarea din verde în roșu, și pot trece dacă acesta este verde sau își schimbă culoarea din roșu în verde. Este desemnat câștigător cel care parcurge distanța de la linia de start pană la final în cel mai scurt timp și fără a depăși s secunde de la începutul competiției.&lt;br /&gt;
Este important de știut faptul că înainte de începerea competiției, fiecare participant trebuie să-și aleagă momentul (exprimat în secunde trecute de la începerea competiției) la care va începe parcurgerea traseului astfel încât să ajungă la final într-un interval de timp cat mai scurt.&lt;br /&gt;
== Cerinţa ==&lt;br /&gt;
Deoarece Gigel știe că nu este important să ajungă primul la final, ci să parcurgă traseul într-un timp cat mai scurt, vă roagă să îl ajutați cu următoarea cerință: determinați momentele de timp pe care Gigel ar putea sa le aleagă pentru a începe parcurgerea traseului astfel încât să nu se oprească la niciun semafor și atunci când ajunge la final să nu fi trecut mai mult de s secunde de la începutul competiției (momentul 0).&lt;br /&gt;
== Date de intrare ==&lt;br /&gt;
Pe prima linie a fișierului de intrare semarun.in se află numerele naturale n, x și s. Pe a doua linie se află numărul natural k, iar pe următoarele k linii se specifică pentru fiecare semafor numerele naturale d, r și v.&lt;br /&gt;
&lt;br /&gt;
== Date de ieșire ==&lt;br /&gt;
Pe prima linie a fișierului de ieșire semarun.out se va scrie numărul de soluții pentru cerința lui Gigel, iar pe a doua linie se vor scrie soluțiile separate printr-un spațiu, ordonate crescător.&lt;br /&gt;
&lt;br /&gt;
Restricții și prec&lt;br /&gt;
== Restricţii şi precizări ==&lt;br /&gt;
* 1 ≤ d ≤ n ≤ 100.000&lt;br /&gt;
* 1 ≤ x ≤ 12&lt;br /&gt;
* 1 ≤ s ≤ 864.000&lt;br /&gt;
* 1 ≤ k ≤ 70.000&lt;br /&gt;
* 1 ≤ r, v ≤ 5&lt;br /&gt;
* Se garantează că pentru datele din fișierul de intrare există cel puțin o soluție.&lt;br /&gt;
* Toate soluțiile din fișierul de ieșire trebuie să fie numere naturale pozitive.&lt;br /&gt;
== Exemplul 1 ==&lt;br /&gt;
; semarun.in&lt;br /&gt;
&lt;br /&gt;
  400 10 60 &lt;br /&gt;
  3&lt;br /&gt;
  30 2 2&lt;br /&gt;
  60 3 3&lt;br /&gt;
  90 4 4 &lt;br /&gt;
; semarun.out&lt;br /&gt;
&lt;br /&gt;
  3&lt;br /&gt;
  3 4 11&lt;br /&gt;
== Explicație ==&lt;br /&gt;
Momentele de timp pe care Gigel le poate alege astfel încât să respecte cerința sunt: 3, 4 sau 11 secunde de la începerea competiției.&lt;br /&gt;
Dacă Gigel începe parcurgerea traseului după 3 secunde de la start, acesta o să ajungă la cele trei semafoare în secundele 6, 9 și 12, fix când acestea își schimbă culoarea din roșu în verde. La final acesta o sa ajungă în secunda 43, încadrându-se în limita a 60 de secunde.&lt;br /&gt;
Pentru orice altă alegere față de cele trei menționate mai sus, Gigel ar întâlni cel puțin un semafor care ar indica culoarea roșu sau și-ar schimba culoarea din verde în roșu la întâlnirea acestuia, ori nu s-ar încadra în limita de timp.&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;gt;&lt;br /&gt;
def possible_start_times(n, x, s, k, semaphores):&lt;br /&gt;
    start_times = []&lt;br /&gt;
    for i in range(k):&lt;br /&gt;
        d, r, v = semaphores[i]&lt;br /&gt;
        if r &amp;gt;= s or v &amp;gt;= s:&lt;br /&gt;
            continue&lt;br /&gt;
        red_circles = (d // (x + r)) * r&lt;br /&gt;
        red_start = d // (x + r) * (x + r)&lt;br /&gt;
        green_circles = (d // (x + r)) * v&lt;br /&gt;
        green_start = (d // (x + r) + 1) * (x + r)&lt;br /&gt;
        if red_circles + green_circles &amp;lt;= s:&lt;br /&gt;
            start_times.append(red_start + 1)&lt;br /&gt;
            start_times.append(green_start + 1)&lt;br /&gt;
    return start_times&lt;br /&gt;
&lt;br /&gt;
def read_input(file_name):&lt;br /&gt;
    with open(file_name, &#039;r&#039;) as file:&lt;br /&gt;
        n, x, s = map(int, file.readline().split())&lt;br /&gt;
        k = int(file.readline())&lt;br /&gt;
        semaphores = [list(map(int, file.readline().split())) for _ in range(k)]&lt;br /&gt;
    return n, x, s, k, semaphores&lt;br /&gt;
&lt;br /&gt;
def write_output(file_name, result):&lt;br /&gt;
    with open(file_name, &#039;w&#039;) as file:&lt;br /&gt;
        file.write(str(len(result)) + &#039;\n&#039;)&lt;br /&gt;
        file.write(&#039; &#039;.join(map(str, result)))&lt;br /&gt;
&lt;br /&gt;
def main():&lt;br /&gt;
    n, x, s, k, semaphores = read_input(&amp;quot;semarun.in&amp;quot;)&lt;br /&gt;
    result = possible_start_times(n, x, s, k, semaphores)&lt;br /&gt;
    write_output(&amp;quot;semarun.out&amp;quot;, result)&lt;br /&gt;
&lt;br /&gt;
if __name__ == &amp;quot;__main__&amp;quot;:&lt;br /&gt;
    main()&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>RebecaBud</name></author>
	</entry>
	<entry>
		<id>https://wiki.universitas.ro/index.php?title=3399_-_Semarun&amp;diff=10054</id>
		<title>3399 - Semarun</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=3399_-_Semarun&amp;diff=10054"/>
		<updated>2024-06-03T17:43:27Z</updated>

		<summary type="html">&lt;p&gt;RebecaBud: Pagină nouă: == Enunt == Pentru că este un bun sportiv și poate alerga constant cu x metri pe secundă, Gigel și-a propus să câștige competiția semarun. Această competiție începe la momentul 0 și constă în parcurgerea unui traseu de n metri, ce conține k semafoare. Pentru fiecare semafor se cunosc: - distanța la care este poziționat față de punctul de start, exprimată în metri – d; - numărul de secunde pentru care acesta indică culoarea roșu – r; - numărul de s...&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Enunt ==&lt;br /&gt;
Pentru că este un bun sportiv și poate alerga constant cu x metri pe secundă, Gigel și-a propus să câștige competiția semarun. Această competiție începe la momentul 0 și constă în parcurgerea unui traseu de n metri, ce conține k semafoare.&lt;br /&gt;
Pentru fiecare semafor se cunosc:&lt;br /&gt;
- distanța la care este poziționat față de punctul de start, exprimată în metri – d;&lt;br /&gt;
- numărul de secunde pentru care acesta indică culoarea roșu – r;&lt;br /&gt;
- numărul de secunde pentru care acesta indică culoarea verde – v.&lt;br /&gt;
La începutul competiției toate semafoarele indică culoarea roșu, apoi alternează între roșu și verde. La întâlnirea unui semafor, participanții trebuie să aștepte dacă acesta este roșu sau își schimbă culoarea din verde în roșu, și pot trece dacă acesta este verde sau își schimbă culoarea din roșu în verde. Este desemnat câștigător cel care parcurge distanța de la linia de start pană la final în cel mai scurt timp și fără a depăși s secunde de la începutul competiției.&lt;br /&gt;
Este important de știut faptul că înainte de începerea competiției, fiecare participant trebuie să-și aleagă momentul (exprimat în secunde trecute de la începerea competiției) la care va începe parcurgerea traseului astfel încât să ajungă la final într-un interval de timp cat mai scurt.&lt;br /&gt;
== Cerinţa ==&lt;br /&gt;
Deoarece Gigel știe că nu este important să ajungă primul la final, ci să parcurgă traseul într-un timp cat mai scurt, vă roagă să îl ajutați cu următoarea cerință: determinați momentele de timp pe care Gigel ar putea sa le aleagă pentru a începe parcurgerea traseului astfel încât să nu se oprească la niciun semafor și atunci când ajunge la final să nu fi trecut mai mult de s secunde de la începutul competiției (momentul 0).&lt;br /&gt;
== Date de intrare ==&lt;br /&gt;
Pe prima linie a fișierului de intrare semarun.in se află numerele naturale n, x și s. Pe a doua linie se află numărul natural k, iar pe următoarele k linii se specifică pentru fiecare semafor numerele naturale d, r și v.&lt;br /&gt;
&lt;br /&gt;
== Date de ieșire ==&lt;br /&gt;
Pe prima linie a fișierului de ieșire semarun.out se va scrie numărul de soluții pentru cerința lui Gigel, iar pe a doua linie se vor scrie soluțiile separate printr-un spațiu, ordonate crescător.&lt;br /&gt;
&lt;br /&gt;
Restricții și prec&lt;br /&gt;
== Restricţii şi precizări ==&lt;br /&gt;
* 1 ≤ d ≤ n ≤ 100.000&lt;br /&gt;
* 1 ≤ x ≤ 12&lt;br /&gt;
* 1 ≤ s ≤ 864.000&lt;br /&gt;
* 1 ≤ k ≤ 70.000&lt;br /&gt;
* 1 ≤ r, v ≤ 5&lt;br /&gt;
* Se garantează că pentru datele din fișierul de intrare există cel puțin o soluție.&lt;br /&gt;
* Toate soluțiile din fișierul de ieșire trebuie să fie numere naturale pozitive.&lt;br /&gt;
== Exemplul 1 ==&lt;br /&gt;
; semarun.in&lt;br /&gt;
&lt;br /&gt;
  400 10 60 &lt;br /&gt;
  3&lt;br /&gt;
  30 2 2&lt;br /&gt;
  60 3 3&lt;br /&gt;
  90 4 4 &lt;br /&gt;
; semarun.out&lt;br /&gt;
&lt;br /&gt;
  3&lt;br /&gt;
  3 4 11&lt;br /&gt;
== Explicație ==&lt;br /&gt;
Momentele de timp pe care Gigel le poate alege astfel încât să respecte cerința sunt: 3, 4 sau 11 secunde de la începerea competiției.&lt;br /&gt;
Dacă Gigel începe parcurgerea traseului după 3 secunde de la start, acesta o să ajungă la cele trei semafoare în secundele 6, 9 și 12, fix când acestea își schimbă culoarea din roșu în verde. La final acesta o sa ajungă în secunda 43, încadrându-se în limita a 60 de secunde.&lt;br /&gt;
Pentru orice altă alegere față de cele trei menționate mai sus, Gigel ar întâlni cel puțin un semafor care ar indica culoarea roșu sau și-ar schimba culoarea din verde în roșu la întâlnirea acestuia, ori nu s-ar încadra în limita de timp.&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;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>RebecaBud</name></author>
	</entry>
	<entry>
		<id>https://wiki.universitas.ro/index.php?title=3679_-_Consolidare&amp;diff=10052</id>
		<title>3679 - Consolidare</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=3679_-_Consolidare&amp;diff=10052"/>
		<updated>2024-06-03T17:40:52Z</updated>

		<summary type="html">&lt;p&gt;RebecaBud: Pagină nouă: == Cerinţa == După consolidarea structurii de rezistență, a venit vremea refacerii zidului cetății. Acesta avea lungimea de L unități și înălțimea de H unități. El deteriorându-se în timp, acum nu mai este dreptunghiular ci, pe fiecare din cele L unități de lungime mai există Vi  unități, de material, așezate una peste alta și sprijinite pe fundație, deci până la înălțimea Vi  unități. Se dorește, evident, acoperirea zonelor rămase așa încâ...&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Cerinţa ==&lt;br /&gt;
După consolidarea structurii de rezistență, a venit vremea refacerii zidului cetății. Acesta avea lungimea de L unități și înălțimea de H unități. El deteriorându-se în timp, acum nu mai este dreptunghiular ci, pe fiecare din cele L unități de lungime mai există Vi&lt;br /&gt;
 unități, de material, așezate una peste alta și sprijinite pe fundație, deci până la înălțimea Vi&lt;br /&gt;
 unități. Se dorește, evident, acoperirea zonelor rămase așa încât zidul să ajungă dreptunghiular, cu înălțimea de H unități pe fiecare din cele L unități de lungime.&lt;br /&gt;
&lt;br /&gt;
Se dispune de bucăți de material, dreptunghiulare, cu o dimensiune de o unitate. Așadar putem spune că bucățile sunt de dimensiuni 1 X B(1 ≤ B ≤ L) și pentru fiecare valoare B dispunem de oricâte bucăți(să le numim de tipul B). Pentru ca zidul să fie stabil, bucățile trebuie să fie dispuse orizontal, adică una de dimensiune 1 X B va ocupa B unități pe lungime și o unitate pe înălțime. Se mai cunoaște că bucățile de același tip B au aceeași culoare și diferită de culoarea bucăților de alte tipuri. Pentru a fi zidul frumos, trebuie ca la aceeași înălțime față de fundație, să se folosească bucăți de material de aceeași culoare. Determinați numărul minim de bucăți necesare refacerii zidului.&lt;br /&gt;
== Date de intrare ==&lt;br /&gt;
Fișierul de intrare consolidare.in conține pe prima linie două numere naturale L și H, separate prin spațiu, reprezentând, conform descrierii de mai sus, lungimea respectiv înălțimea pe care trebuie să o aibă zidul refăcut. Pe linia a doua se află L numere naturale nenule, separate prin câte un spațiu indicând, în ordine, înălțimea în unități a părții existente, pentru fiecare unitate de lungime.&lt;br /&gt;
== Date de ieșire ==&lt;br /&gt;
Fișierul de ieșire consolidare.out va conține pe primul rând o valoare naturală ce reprezintă numărul minim de bucăți folosite pentru a construi zidul conform restricțiilor.&lt;br /&gt;
== Restricţii şi precizări ==&lt;br /&gt;
* 1 ≤ L ≤ 100.000&lt;br /&gt;
* 1 ≤ H ≤ 10&lt;br /&gt;
* 0≤Vi≤H&lt;br /&gt;
* Nu este permis ca o bucată de material să iasă în afara celor L unități de lungime.&lt;br /&gt;
== Exemplul 1 ==&lt;br /&gt;
; consolidare.in&lt;br /&gt;
 &lt;br /&gt;
  10 4&lt;br /&gt;
  0 0 1 3 0 1 1 2 2 2&lt;br /&gt;
; consolidare.out&lt;br /&gt;
&lt;br /&gt;
  9&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;gt;&lt;br /&gt;
def minimum_pieces_needed(L, H, heights):&lt;br /&gt;
    pieces_needed = 0&lt;br /&gt;
    current_height = [0] * (H + 1)&lt;br /&gt;
    &lt;br /&gt;
    for i in range(L):&lt;br /&gt;
        for j in range(heights[i], H):&lt;br /&gt;
            if current_height[j] == 0:&lt;br /&gt;
                pieces_needed += 1&lt;br /&gt;
                current_height[j] = 1&lt;br /&gt;
        current_height[heights[i]] += 1&lt;br /&gt;
    &lt;br /&gt;
    return pieces_needed&lt;br /&gt;
&lt;br /&gt;
def read_input(file_name):&lt;br /&gt;
    with open(file_name, &#039;r&#039;) as file:&lt;br /&gt;
        L, H = map(int, file.readline().split())&lt;br /&gt;
        heights = list(map(int, file.readline().split()))&lt;br /&gt;
    return L, H, heights&lt;br /&gt;
&lt;br /&gt;
def write_output(file_name, result):&lt;br /&gt;
    with open(file_name, &#039;w&#039;) as file:&lt;br /&gt;
        file.write(str(result))&lt;br /&gt;
&lt;br /&gt;
def main():&lt;br /&gt;
    L, H, heights = read_input(&amp;quot;consolidare.in&amp;quot;)&lt;br /&gt;
    result = minimum_pieces_needed(L, H, heights)&lt;br /&gt;
    write_output(&amp;quot;consolidare.out&amp;quot;, result)&lt;br /&gt;
&lt;br /&gt;
if __name__ == &amp;quot;__main__&amp;quot;:&lt;br /&gt;
    main()&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>RebecaBud</name></author>
	</entry>
	<entry>
		<id>https://wiki.universitas.ro/index.php?title=3832_-_A_-_Manhattan_de_Buget&amp;diff=10050</id>
		<title>3832 - A - Manhattan de Buget</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=3832_-_A_-_Manhattan_de_Buget&amp;diff=10050"/>
		<updated>2024-06-03T17:37:59Z</updated>

		<summary type="html">&lt;p&gt;RebecaBud: Pagină nouă: == Cerinţa == Dându-se N puncte laticiale, care este distanța Manhattan de buget minimă dintre două puncte de coordonate a b respectiv x y cu proprietatea că a-y &amp;gt;= x-b? == Date de intrare == Fișierul de intrare mman.in conține pe prima linie numărul N, iar pe următoarele n linii se află câte două numere, pe linia i se află coordonatele x respectiv y ale punctului i. == Date de ieșire == Fișierul de ieșire mman.out va conține pe prima linie numărul M reprez...&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Cerinţa ==&lt;br /&gt;
Dându-se N puncte laticiale, care este distanța Manhattan de buget minimă dintre două puncte de coordonate a b respectiv x y cu proprietatea că a-y &amp;gt;= x-b?&lt;br /&gt;
== Date de intrare ==&lt;br /&gt;
Fișierul de intrare mman.in conține pe prima linie numărul N, iar pe următoarele n linii se află câte două numere, pe linia i se află coordonatele x respectiv y ale punctului i.&lt;br /&gt;
== Date de ieșire ==&lt;br /&gt;
Fișierul de ieșire mman.out va conține pe prima linie numărul M reprezentând valoarea cerută.&lt;br /&gt;
== Restricţii şi precizări ==&lt;br /&gt;
* 2 ≤ n ≤ 100.000&lt;br /&gt;
* coordonatele tuturor punctelor aparțin intervalului [-1.000.000.000, 1.000.000.000].&lt;br /&gt;
* Distanța Manhattan de buget dintre punctul cu coordonate a b si punctul de coordonate x y este a-x+b-y.&lt;br /&gt;
== Exemplul 1 ==&lt;br /&gt;
; mman.in&lt;br /&gt;
&lt;br /&gt;
  3&lt;br /&gt;
  1 1&lt;br /&gt;
  2 3&lt;br /&gt;
  -1 -1&lt;br /&gt;
; mman.out&lt;br /&gt;
&lt;br /&gt;
  3&lt;br /&gt;
== Explicație ==&lt;br /&gt;
Distanța minimă dintre două puncte se obține din punctele cu coordonate 1 1 și 2 3.&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;gt;&lt;br /&gt;
def minimum_manhattan_distance(n, points):&lt;br /&gt;
    min_distance = float(&#039;inf&#039;)&lt;br /&gt;
    points.sort(key=lambda point: point[0] - point[1])&lt;br /&gt;
    &lt;br /&gt;
    for i in range(1, n):&lt;br /&gt;
        distance = points[i][0] - points[i-1][0] + points[i][1] - points[i-1][1]&lt;br /&gt;
        min_distance = min(min_distance, distance)&lt;br /&gt;
    &lt;br /&gt;
    return min_distance&lt;br /&gt;
&lt;br /&gt;
def read_input(file_name):&lt;br /&gt;
    with open(file_name, &#039;r&#039;) as file:&lt;br /&gt;
        n = int(file.readline().strip())&lt;br /&gt;
        points = [tuple(map(int, line.strip().split())) for _ in range(n)]&lt;br /&gt;
    return n, points&lt;br /&gt;
&lt;br /&gt;
def write_output(file_name, result):&lt;br /&gt;
    with open(file_name, &#039;w&#039;) as file:&lt;br /&gt;
        file.write(str(result))&lt;br /&gt;
&lt;br /&gt;
def main():&lt;br /&gt;
    n, points = read_input(&amp;quot;mman.in&amp;quot;)&lt;br /&gt;
    result = minimum_manhattan_distance(n, points)&lt;br /&gt;
    write_output(&amp;quot;mman.out&amp;quot;, result)&lt;br /&gt;
&lt;br /&gt;
if __name__ == &amp;quot;__main__&amp;quot;:&lt;br /&gt;
    main()&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>RebecaBud</name></author>
	</entry>
	<entry>
		<id>https://wiki.universitas.ro/index.php?title=3820_-_Mordor_Trip&amp;diff=10049</id>
		<title>3820 - Mordor Trip</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=3820_-_Mordor_Trip&amp;diff=10049"/>
		<updated>2024-06-03T17:36:16Z</updated>

		<summary type="html">&lt;p&gt;RebecaBud: Pagină nouă: == Cerinţa == Dr. Le Quack , fiind un mare fan al Lord Of The Rings , decide să plece în Mordor , locul unde a fost făurit inelul atotputernic . Când acesta ajunge la turnul lui Sauron , observă că intrarea are un cifru . Cifrul este un șir de numere întregi. Dr. Le Quack poate aplică următorul algoritm șirului :    for(int i=1;i&amp;lt;n;i++){       if(a[i]&amp;lt;=a[i+1]){           swap(a[i], a[i+1]);       }   } Dr. Le Quack poate aplica acest tip de operatie de un număr n...&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Cerinţa ==&lt;br /&gt;
Dr. Le Quack , fiind un mare fan al Lord Of The Rings , decide să plece în Mordor , locul unde a fost făurit inelul atotputernic . Când acesta ajunge la turnul lui Sauron , observă că intrarea are un cifru . Cifrul este un șir de numere întregi. Dr. Le Quack poate aplică următorul algoritm șirului :&lt;br /&gt;
&lt;br /&gt;
  for(int i=1;i&amp;lt;n;i++){&lt;br /&gt;
      if(a[i]&amp;lt;=a[i+1]){&lt;br /&gt;
          swap(a[i], a[i+1]);&lt;br /&gt;
      }&lt;br /&gt;
  }&lt;br /&gt;
Dr. Le Quack poate aplica acest tip de operatie de un număr nelimitat de ori ( posibil 0 ). Intrarea se va deschide atunci când șirul va fi unul descrescator. Un șir este descrescător dacă pentru fiecare i din intervalul [1 , n-1] se respectă condiția a[i] ≥ a[i+1]. Dr. Le Quack fiind lacom vrea să stie care este numărul minim operații pentru a deschide intrarea. Pentru că acesta a chiulit de la orele de informatică uitat cum se rezolvă problemele de natură algoritmica , vă roaga sa îl ajutați în schimbul a 100 de puncte și asigurare medicală la cabinetul său.&lt;br /&gt;
== Date de intrare ==&lt;br /&gt;
Fișierul de intrare mordortrip.in conține pe prima linie numărul n, iar pe a doua linie n numere întregi separate prin spații.&lt;br /&gt;
== Date de ieșire ==&lt;br /&gt;
Fișierul de ieșire mordortrip.out conține pe prima linie un număr ans reprezentând numărul minim de operații ale&lt;br /&gt;
algoritmului specificat mai sus pentru a sorta vectorul dat la input într-unul descrescător.&lt;br /&gt;
== Restricţii şi precizări ==&lt;br /&gt;
* Numerele sunt întregi , din intervalul [ -1.000.000.000 , 1.000.000.000 ] , NU neapărat distincte.&lt;br /&gt;
* Se garantează că avem mereu soluție dintr-un număr finit de operații ale algoritmului descris.&lt;br /&gt;
* Pentru teste în valoare de 20 de puncte , N ≤ 5.000.&lt;br /&gt;
* Pentru restul testelor , N ≤ 1.000.000.&lt;br /&gt;
== Exemplul 1 ==&lt;br /&gt;
; mordortrip.in&lt;br /&gt;
&lt;br /&gt;
  5&lt;br /&gt;
  5 1 3 2 4&lt;br /&gt;
; mordortrip.out&lt;br /&gt;
&lt;br /&gt;
  3&lt;br /&gt;
; mordortrip.in&lt;br /&gt;
&lt;br /&gt;
  4&lt;br /&gt;
  3 1 2 2&lt;br /&gt;
; mordortrip.out&lt;br /&gt;
&lt;br /&gt;
 1&lt;br /&gt;
== Explicație ==&lt;br /&gt;
În primul exemplu , sunt necesare doar 3 aplicări ale algoritmului : 1 – 5 3 2 4 1 ; 2 – 5 3 4 2 1 ; 3 – 5 4 3 2 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;gt;&lt;br /&gt;
def minimum_operations(n, arr):&lt;br /&gt;
    operations = 0&lt;br /&gt;
    &lt;br /&gt;
    for i in range(1, n):&lt;br /&gt;
        if arr[i] &amp;lt;= arr[i-1]:&lt;br /&gt;
            operations += arr[i-1] - arr[i] + 1&lt;br /&gt;
            arr[i] = arr[i-1] + 1&lt;br /&gt;
    &lt;br /&gt;
    return operations&lt;br /&gt;
&lt;br /&gt;
def read_input(file_name):&lt;br /&gt;
    with open(file_name, &#039;r&#039;) as file:&lt;br /&gt;
        n = int(file.readline().strip())&lt;br /&gt;
        arr = list(map(int, file.readline().strip().split()))&lt;br /&gt;
    return n, arr&lt;br /&gt;
&lt;br /&gt;
def write_output(file_name, result):&lt;br /&gt;
    with open(file_name, &#039;w&#039;) as file:&lt;br /&gt;
        file.write(str(result))&lt;br /&gt;
&lt;br /&gt;
def main():&lt;br /&gt;
    n, arr = read_input(&amp;quot;mordortrip.in&amp;quot;)&lt;br /&gt;
    result = minimum_operations(n, arr)&lt;br /&gt;
    write_output(&amp;quot;mordortrip.out&amp;quot;, result)&lt;br /&gt;
&lt;br /&gt;
if __name__ == &amp;quot;__main__&amp;quot;:&lt;br /&gt;
    main()&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>RebecaBud</name></author>
	</entry>
	<entry>
		<id>https://wiki.universitas.ro/index.php?title=3823_-_A_-_Flipped_Cards&amp;diff=10047</id>
		<title>3823 - A - Flipped Cards</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=3823_-_A_-_Flipped_Cards&amp;diff=10047"/>
		<updated>2024-06-03T17:33:57Z</updated>

		<summary type="html">&lt;p&gt;RebecaBud: Pagină nouă: == Cerinţa == După ce Le Quack și-a pierdut toți banii dați de mama lui să cumpere pâine la Blackjack, acesta a decis să își creeze propriul joc de cărți unde își poate bate prietenii și să câștige banii înapoi. Jocul se joacă cu un pachet de N cărți. Pachetul de cărți este reprezentat că un șir binar cum va fi descris în cele ce urmează.Cărțile pot fi așezate pe față sau pe spate fără a conta culoarea sau valoarea cărții, pentru simplitat...&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Cerinţa ==&lt;br /&gt;
După ce Le Quack și-a pierdut toți banii dați de mama lui să cumpere pâine la Blackjack, acesta a decis să își creeze propriul joc de cărți unde își poate bate prietenii și să câștige banii înapoi. Jocul se joacă cu un pachet de N cărți. Pachetul de cărți este reprezentat că un șir binar cum va fi descris în cele ce urmează.Cărțile pot fi așezate pe față sau pe spate fără a conta culoarea sau valoarea cărții, pentru simplitate codificăm o care întoarsă prin cifra 0 și o carte pe față prin cifra 1 . Fiecare jucător poate face un număr nelimitat de operații de următorul tip: se alege un index i și se întorc toate cărțile din secvență de cărți i...n, adică o carte de valoare 0 se transformă în carte de valoare 1 și invers. Acum este rândul lui Le Quack, el va prezintă configurația curentă a cărților și voi trebuie să îl ajutați cu 2 cerințe, el va poate răsplăti cu un posibil loc I la concurs.&lt;br /&gt;
&lt;br /&gt;
Cerinta 1: Stiind configuratia cartilor sunteti rugati sa aflati lungimea maxima a unei secvente de carti, astfel incat costul de a transforma aceasta secventa intr-o secventa de carti care contin doar valori de 1 este maxim K.&lt;br /&gt;
&lt;br /&gt;
Certina 2: Stiind configuratia cartilor sunteti intrebati care este numarul secventelor de carti pentru care numarul minim de operatii pentru a devni o secventa care contine numai valori de 1 este fix K.&lt;br /&gt;
&lt;br /&gt;
== Date de intrare ==&lt;br /&gt;
Pe prima linie sunt scrise valorile C, N si K, reprezentand numarul cerintei, numarul de carti respectiv valoarea K descrisa in enunt. Pe a doua linie sunt N valori binare reprezentand sirul de carti. Numerele se citesc din fisierul flipc.in.&lt;br /&gt;
== Date de ieșire ==&lt;br /&gt;
Se va tiparii un singur numar, reprezentand raspunul la cerinta aferenta. Numerele se tiparesc in fisieru flipc.out.&lt;br /&gt;
== Restricţii şi precizări ==&lt;br /&gt;
* Cerinta I:&lt;br /&gt;
Pentru 40/40 p : N &amp;lt;= 1.000.000 , K &amp;lt;= N&lt;br /&gt;
Pentru 30/40 p : N &amp;lt;= 200.000 , K &amp;lt;= N&lt;br /&gt;
Pentru 10/40 p : N &amp;lt;= 10.000 , K &amp;lt;= min(N , 100)&lt;br /&gt;
* Cerinta II:&lt;br /&gt;
Pentru 60/60 p : N &amp;lt;= 1.000.000 , K &amp;lt;= N&lt;br /&gt;
Pentru 50/60 p : N &amp;lt;= 200.000 , K &amp;lt;= N&lt;br /&gt;
Pentru 15/60 p : N &amp;lt;= 10.000 , K &amp;lt;= min(N , 100)&lt;br /&gt;
O carte NU se poate roti de 2 ori in aceasi mutare !&lt;br /&gt;
== Exemplul 1 ==&lt;br /&gt;
; flipc.in&lt;br /&gt;
&lt;br /&gt;
  1 5 2&lt;br /&gt;
  10001&lt;br /&gt;
; flipc.out&lt;br /&gt;
&lt;br /&gt;
  5&lt;br /&gt;
; flipc.in&lt;br /&gt;
&lt;br /&gt;
  2 13 4&lt;br /&gt;
  1010011111101&lt;br /&gt;
; flipc.out&lt;br /&gt;
&lt;br /&gt;
  15&lt;br /&gt;
= Explicație ==&lt;br /&gt;
Pentru primul exemplu : putem transforma tot stringul in valori de 1 in 2 operatii, prima operatie la&lt;br /&gt;
pozitia 2 si a doua la pozitia 5.&lt;br /&gt;
Pentru al doilea exemplu : niste exemple de secvente care contin doar valori de 1 si sunt formate prin&lt;br /&gt;
4 operatii ar avea capetele: {1,6}, {2,6}, {1,9} .....&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Exemplul 2 ==&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;gt;&lt;br /&gt;
def max_length_of_sequence(N, K, cards):&lt;br /&gt;
    max_len = 0&lt;br /&gt;
    count_zeroes = 0&lt;br /&gt;
    left, right = 0, 0&lt;br /&gt;
&lt;br /&gt;
    while right &amp;lt; N:&lt;br /&gt;
        if cards[right] == &#039;0&#039;:&lt;br /&gt;
            count_zeroes += 1&lt;br /&gt;
&lt;br /&gt;
        while count_zeroes &amp;gt; K:&lt;br /&gt;
            if cards[left] == &#039;0&#039;:&lt;br /&gt;
                count_zeroes -= 1&lt;br /&gt;
            left += 1&lt;br /&gt;
&lt;br /&gt;
        max_len = max(max_len, right - left + 1)&lt;br /&gt;
        right += 1&lt;br /&gt;
&lt;br /&gt;
    return max_len&lt;br /&gt;
&lt;br /&gt;
def count_sequences(N, K, cards):&lt;br /&gt;
    count = 0&lt;br /&gt;
    count_zeroes = 0&lt;br /&gt;
    left, right = 0, 0&lt;br /&gt;
&lt;br /&gt;
    while right &amp;lt; N:&lt;br /&gt;
        if cards[right] == &#039;0&#039;:&lt;br /&gt;
            count_zeroes += 1&lt;br /&gt;
&lt;br /&gt;
        while count_zeroes &amp;gt; K:&lt;br /&gt;
            if cards[left] == &#039;0&#039;:&lt;br /&gt;
                count_zeroes -= 1&lt;br /&gt;
            left += 1&lt;br /&gt;
&lt;br /&gt;
        if count_zeroes == K:&lt;br /&gt;
            count += N - right&lt;br /&gt;
&lt;br /&gt;
        right += 1&lt;br /&gt;
&lt;br /&gt;
    return count&lt;br /&gt;
&lt;br /&gt;
def solve_problem(C, N, K, cards):&lt;br /&gt;
    if C == 1:&lt;br /&gt;
        return max_length_of_sequence(N, K, cards)&lt;br /&gt;
    elif C == 2:&lt;br /&gt;
        return count_sequences(N, K, cards)&lt;br /&gt;
&lt;br /&gt;
def read_input(file_name):&lt;br /&gt;
    with open(file_name, &#039;r&#039;) as file:&lt;br /&gt;
        line = file.readline().strip().split()&lt;br /&gt;
        C, N, K = map(int, line)&lt;br /&gt;
        cards = file.readline().strip()&lt;br /&gt;
    return C, N, K, cards&lt;br /&gt;
&lt;br /&gt;
def write_output(file_name, result):&lt;br /&gt;
    with open(file_name, &#039;w&#039;) as file:&lt;br /&gt;
        file.write(str(result))&lt;br /&gt;
&lt;br /&gt;
def main():&lt;br /&gt;
    C, N, K, cards = read_input(&amp;quot;flipc.in&amp;quot;)&lt;br /&gt;
    result = solve_problem(C, N, K, cards)&lt;br /&gt;
    write_output(&amp;quot;flipc.out&amp;quot;, result)&lt;br /&gt;
&lt;br /&gt;
if __name__ == &amp;quot;__main__&amp;quot;:&lt;br /&gt;
    main()&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>RebecaBud</name></author>
	</entry>
	<entry>
		<id>https://wiki.universitas.ro/index.php?title=4124_-_Colibri&amp;diff=10045</id>
		<title>4124 - Colibri</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=4124_-_Colibri&amp;diff=10045"/>
		<updated>2024-06-03T17:31:11Z</updated>

		<summary type="html">&lt;p&gt;RebecaBud: Pagină nouă: == Enunt == Se dau N triplete de numere naturale (ai, bi, ci), unde ai ≠ 0 și 1 ≤ i ≤ N, fiecare reprezentând câte un număr rațional qi egal cu: (−1)aibici == Cerinţa == Găsiți un subșir nevid al șirului q1, q2, …, qN al cărui produs al valorilor să fie maxim posibil. == Date de intrare == Fișierul de intrare colibri.in conține pe prima linie numărul N. Următoarele N linii descriu cele N triplete: pe linia i se află numerele naturale ai, bi, ci, sep...&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Enunt ==&lt;br /&gt;
Se dau N triplete de numere naturale (ai, bi, ci), unde ai ≠ 0 și 1 ≤ i ≤ N, fiecare reprezentând câte un număr rațional qi egal cu: (−1)aibici&lt;br /&gt;
== Cerinţa ==&lt;br /&gt;
Găsiți un subșir nevid al șirului q1, q2, …, qN al cărui produs al valorilor să fie maxim posibil.&lt;br /&gt;
== Date de intrare ==&lt;br /&gt;
Fișierul de intrare colibri.in conține pe prima linie numărul N. Următoarele N linii descriu cele N triplete: pe linia i se află numerele naturale ai, bi, ci, separate prin spații.&lt;br /&gt;
== Date de ieșire ==&lt;br /&gt;
Pe prima linie a fișierului de ieșire colibri.out se află un șir de N cifre. Cifra i, unde 1 ≤ i ≤ N, este 1 dacă și numai dacă qi este selectat în subșirul soluție, altfel este 0. Cifrele șirului nu se vor separa prin spații.&lt;br /&gt;
== Restricţii şi precizări ==&lt;br /&gt;
* 1 ≤ N ≤ 50.000;&lt;br /&gt;
* 0 ≤ ai, bi ≤ 1.000.000, oricare ar fi 1 ≤ i ≤ N;&lt;br /&gt;
* 1 ≤ ci ≤ 1.000.000, oricare ar fi 1 ≤ i ≤ N;&lt;br /&gt;
* Dacă există mai multe soluții, atunci se acceptă orice soluție corectă;&lt;br /&gt;
* Spunem că un șir x este subșir al unui șir y dacă și numai dacă x se poate obține din y eliminând o parte din * elementele lui y (inclusiv nici unul) fără a schimba ordinea relativă a elementelor rămase.&lt;br /&gt;
* Pentru 30 de puncte, N ≤ 19 și ai, ci, ci ≤ 9&lt;br /&gt;
* Pentru 20 de puncte, N ≤ 19&lt;br /&gt;
* Pentru 20 de puncte, ai, bi, ci ≤ 9&lt;br /&gt;
* Pentru 30 de puncte, fără restricții suplimentare&lt;br /&gt;
== Exemplul 1 ==&lt;br /&gt;
; colibri.in&lt;br /&gt;
&lt;br /&gt;
  5&lt;br /&gt;
  0 0 1&lt;br /&gt;
  2 4 2&lt;br /&gt;
  4 7 7&lt;br /&gt;
  1 2 3&lt;br /&gt;
  0 3 2&lt;br /&gt;
; colibri.out&lt;br /&gt;
&lt;br /&gt;
  01001&lt;br /&gt;
== Explicație ==&lt;br /&gt;
În exemplu N=5, q1=01, q2=42, q3=77, q4=−23 și q5=32.&lt;br /&gt;
&lt;br /&gt;
Produsul maxim posibil este egal cu 3. Acesta se poate obține luând fie subșirul constând din numerele q2 și q5, fie luând subșirul format din numerele q2, q3 și q5. Cu alte cuvinte, și răspunsul 01101 este corect.&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;gt;&lt;br /&gt;
def max_product_subarray(N, triples):&lt;br /&gt;
    max_product = float(&#039;-inf&#039;)&lt;br /&gt;
    max_index = -1&lt;br /&gt;
&lt;br /&gt;
    for i in range(N):&lt;br /&gt;
        ai, bi, ci = triples[i]&lt;br /&gt;
        current_product = (-1) ** (ai * bi) * ci&lt;br /&gt;
        if current_product &amp;gt; max_product:&lt;br /&gt;
            max_product = current_product&lt;br /&gt;
            max_index = i&lt;br /&gt;
&lt;br /&gt;
    result = [&#039;0&#039;] * N&lt;br /&gt;
    result[max_index] = &#039;1&#039;&lt;br /&gt;
    return &#039;&#039;.join(result)&lt;br /&gt;
&lt;br /&gt;
def main():&lt;br /&gt;
    N = int(input())&lt;br /&gt;
    triples = [list(map(int, input().split())) for _ in range(N)]&lt;br /&gt;
&lt;br /&gt;
    result = max_product_subarray(N, triples)&lt;br /&gt;
    print(result)&lt;br /&gt;
&lt;br /&gt;
if __name__ == &amp;quot;__main__&amp;quot;:&lt;br /&gt;
    main()&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>RebecaBud</name></author>
	</entry>
	<entry>
		<id>https://wiki.universitas.ro/index.php?title=4115_-_Investitie&amp;diff=10043</id>
		<title>4115 - Investitie</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=4115_-_Investitie&amp;diff=10043"/>
		<updated>2024-06-03T17:27:52Z</updated>

		<summary type="html">&lt;p&gt;RebecaBud: Pagină nouă: == Enunt == După o lungă activitate în domeniul instalaţiilor sanitare, Dorel s-a hotărât să investească averea acumulată în acţiuni ale mai multor companii. Astfel, el dispune de o listă cu N companii la care vrea să cumpere acţiuni, în M zile consecutive.  În prima zi, suma de bani investită în compania i este s[1][i] = a[i], pentru orice i=1..N, unde valorile a[i] sunt date.  Numerele a[1], a[2], …, a[N] reprezintă o permutare a numerelor 1,2,...,N}....&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Enunt ==&lt;br /&gt;
După o lungă activitate în domeniul instalaţiilor sanitare, Dorel s-a hotărât să investească averea acumulată în acţiuni ale mai multor companii. Astfel, el dispune de o listă cu N companii la care vrea să cumpere acţiuni, în M zile consecutive.&lt;br /&gt;
&lt;br /&gt;
În prima zi, suma de bani investită în compania i este s[1][i] = a[i], pentru orice i=1..N, unde valorile a[i] sunt date.&lt;br /&gt;
&lt;br /&gt;
Numerele a[1], a[2], …, a[N] reprezintă o permutare a numerelor 1,2,...,N}.&lt;br /&gt;
&lt;br /&gt;
În ziua a j-a el va investi în compania i o sumă de bani egală cu s[j][i] = s[j-1][a[i]], pentru orice zi j =2..M şi orice companie i = 1..N.&lt;br /&gt;
== Cerinţa ==&lt;br /&gt;
După finalizarea planului de investiţii, Dorel vrea să realizeze Q statistici referitoare la sumele investite. Fiind date Q seturi de valori zi, zf, cl, cr, el doreşte să afle ce sumă a investit în perioada cuprinsă între zilele zi și zf (inclusiv acestea), la companiile cu numere de ordine cuprinse între cl și cr (inclusiv acestea).&lt;br /&gt;
== Date de intrare ==&lt;br /&gt;
Pe prima linie a fişierului de intrare investitie.in se află numerele N şi M, separate prin spaţiu. Pe a doua linie se află valorile a[1], a[2], ..., a[N], separate prin spaţiu. Pe a treia linie se află valoarea lui Q. Pe următoarele Q linii se află câte patru valori, zi, zf, cl, cr, separate prin spaţiu.&lt;br /&gt;
== Date de ieșire ==&lt;br /&gt;
În fişierul de ieşire investitie.out se vor afişa, pe linii diferite, sumele investite corespunzătoare fiecăreia din cele Q statistici din fişierul de intrare.&lt;br /&gt;
== Restricţii şi precizări ==&lt;br /&gt;
* 1 ≤ N, Q ≤ 100.000&lt;br /&gt;
* 1 ≤ M ≤ 1.000.000.000&lt;br /&gt;
* 1 ≤ zi ≤ zf ≤ M&lt;br /&gt;
* 1 ≤ cl ≤ cr ≤ N&lt;br /&gt;
* 0 ≤ cr -cl ≤ 100&lt;br /&gt;
* Pentru 10 puncte, M = 1&lt;br /&gt;
* Pentru 20 de puncte, 1 ≤  N, M ≤ 100, 1 ≤ Q ≤ 1000&lt;br /&gt;
* Pentru 12 puncte, 101 ≤ N , M ≤ 3000&lt;br /&gt;
* Pentru 24 de puncte, 1 ≤ N ≤ 50&lt;br /&gt;
* Pentru 34 de puncte fără alte restricţii&lt;br /&gt;
== Exemplul 1 ==&lt;br /&gt;
; investitie.in&lt;br /&gt;
&lt;br /&gt;
  8 3&lt;br /&gt;
  3 1 7 2 6 4 5 8&lt;br /&gt;
  5&lt;br /&gt;
  1 1 3 7&lt;br /&gt;
  1 2 1 4&lt;br /&gt;
  1 3 2 8&lt;br /&gt;
  2 3 3 6&lt;br /&gt;
  3 3 3 3&lt;br /&gt;
; investitie.out&lt;br /&gt;
&lt;br /&gt;
  24&lt;br /&gt;
  29&lt;br /&gt;
  93&lt;br /&gt;
  24&lt;br /&gt;
  6&lt;br /&gt;
== Explicație ==&lt;br /&gt;
Sumele investite în cele trei zile, în acţiuni ale celor opt companii, vor fi:&lt;br /&gt;
&lt;br /&gt;
3 &amp;amp; 1 &amp;amp; 7 &amp;amp; 2 &amp;amp; 6 &amp;amp; 4 &amp;amp; 5 &amp;amp; 8&lt;br /&gt;
7 &amp;amp; 3 &amp;amp; 5 &amp;amp; 1 &amp;amp; 4 &amp;amp; 2 &amp;amp; 6 &amp;amp; 8&lt;br /&gt;
5 &amp;amp; 7 &amp;amp; 6 &amp;amp; 3 &amp;amp; 2 &amp;amp; 1 &amp;amp; 4 &amp;amp; 8&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Prima statistică cere suma investită în prima zi în companiile cu numere de ordine de la 3 la 7. Suma este 7+2+6+4+5=24.&lt;br /&gt;
A doua statistică cere suma investită în primele două zile în companiile cu numerele de ordine de la 12 la 4. Suma este (3+1+7+2)+(7+3+5+1)=29.&lt;br /&gt;
Similar se calculează celelalte statistici.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&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;gt;&lt;br /&gt;
def investition(N, M, a, Q, queries):&lt;br /&gt;
    investments = [[0] * (N + 1) for _ in range(M + 1)]&lt;br /&gt;
    for i in range(1, N + 1):&lt;br /&gt;
        investments[1][i] = a[i - 1]&lt;br /&gt;
    for j in range(2, M + 1):&lt;br /&gt;
        for i in range(1, N + 1):&lt;br /&gt;
            investments[j][i] = investments[j - 1][a[i - 1]]&lt;br /&gt;
    &lt;br /&gt;
    cumulative_investments = [[0] * (N + 1) for _ in range(M + 1)]&lt;br /&gt;
    for j in range(1, M + 1):&lt;br /&gt;
        for i in range(1, N + 1):&lt;br /&gt;
            cumulative_investments[j][i] = cumulative_investments[j - 1][i] + investments[j][i]&lt;br /&gt;
    &lt;br /&gt;
    results = []&lt;br /&gt;
    for query in queries:&lt;br /&gt;
        zi, zf, cl, cr = query&lt;br /&gt;
        total_investment = 0&lt;br /&gt;
        for i in range(cl, cr + 1):&lt;br /&gt;
            total_investment += cumulative_investments[zf][i] - cumulative_investments[zi - 1][i]&lt;br /&gt;
        results.append(total_investment)&lt;br /&gt;
    return results&lt;br /&gt;
&lt;br /&gt;
def main():&lt;br /&gt;
    N, M = map(int, input().split())&lt;br /&gt;
    a = list(map(int, input().split()))&lt;br /&gt;
    Q = int(input())&lt;br /&gt;
    queries = [list(map(int, input().split())) for _ in range(Q)]&lt;br /&gt;
&lt;br /&gt;
    results = investition(N, M, a, Q, queries)&lt;br /&gt;
    for result in results:&lt;br /&gt;
        print(result)&lt;br /&gt;
&lt;br /&gt;
if __name__ == &amp;quot;__main__&amp;quot;:&lt;br /&gt;
    main()&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>RebecaBud</name></author>
	</entry>
	<entry>
		<id>https://wiki.universitas.ro/index.php?title=3889_-_Cnt_Subsir_Max&amp;diff=10041</id>
		<title>3889 - Cnt Subsir Max</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=3889_-_Cnt_Subsir_Max&amp;diff=10041"/>
		<updated>2024-06-03T17:24:43Z</updated>

		<summary type="html">&lt;p&gt;RebecaBud: Pagină nouă: == Cerinţa == Felicia este interesată de subșirul maxim lexicografic al unui șir de caractere. Rețineți că un șir a este considerat mai mic în ordine lexicografică decât un șir b dacă a este prefix al lui b, sau dacă există o poziție i pentru care avem a[1] = b[1], ..., a[i − 1] = b[i − 1], și a[i] &amp;lt; b[i]. Astfel, subșirul maxim lexicografic al unui șir de caractere este cel mai mare subșir, în ordinea lexicografică, al unui șir de caractere (de exe...&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Cerinţa ==&lt;br /&gt;
Felicia este interesată de subșirul maxim lexicografic al unui șir de caractere. Rețineți că un șir a este considerat mai mic în ordine lexicografică decât un șir b dacă a este prefix al lui b, sau dacă există o poziție i pentru care avem a[1] = b[1], ..., a[i − 1] = b[i − 1], și a[i] &amp;lt; b[i]. Astfel, subșirul maxim lexicografic al unui șir de caractere este cel mai mare subșir, în ordinea lexicografică, al unui șir de caractere (de exemplu zzxx pentru azbxazbxaax). Pentru un șir s de caractere vom nota cu m(s) subșirul maxim lexicografic al lui s, și cu v(s) = |m(s)| lungimea acestui subșir. Felicia vă dă un șir s format din caractere mici ale alfabetului englez. Considerați toate subsecvențele continue s&#039; ale lui s. Felicia vrea să calculați suma valorilor v(s&#039;) pentru toate subsecvențele posibile s&#039; amintite anterior.&lt;br /&gt;
== Date de intrare ==&lt;br /&gt;
Pe singura linie citită de la tastatură se va găsi șirul s.&lt;br /&gt;
== Date de ieșire ==&lt;br /&gt;
Să se afișeze suma cerută, modulo 109+7.&lt;br /&gt;
== Restricţii şi precizări ==&lt;br /&gt;
* 1≤N≤106&lt;br /&gt;
== Subtask ==&lt;br /&gt;
* N≤15&lt;br /&gt;
== Subtask ==&lt;br /&gt;
* N≤200&lt;br /&gt;
== Subtask ==&lt;br /&gt;
* N≤2000&lt;br /&gt;
== Subtask ==&lt;br /&gt;
* N≤5⋅104&lt;br /&gt;
== Subtask ==&lt;br /&gt;
* Fară restricții suplimentare.&lt;br /&gt;
== Exemplul 1 ==&lt;br /&gt;
; Intrare&lt;br /&gt;
&lt;br /&gt;
  cab&lt;br /&gt;
; Ieșire&lt;br /&gt;
&lt;br /&gt;
 8&lt;br /&gt;
== Explicație ==&lt;br /&gt;
Pentru primul exemplu, observăm că m(c) = c, m(a) = a, m(b) = b, m(ca) = ca, m(ab) = b, m(cab) = cb.&lt;br /&gt;
Astfel, răspunsul este 1 + 1 + 1 + 2 + 1 + 2 = 8. &lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Exemplu 2 ==&lt;br /&gt;
; Intrare&lt;br /&gt;
&lt;br /&gt;
  felicia&lt;br /&gt;
; Ieșire&lt;br /&gt;
&lt;br /&gt;
  59&lt;br /&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;gt;&lt;br /&gt;
MOD = 10**9 + 7&lt;br /&gt;
&lt;br /&gt;
def max_lexicographic(s):&lt;br /&gt;
    max_substring = s[0]&lt;br /&gt;
    for i in range(1, len(s)):&lt;br /&gt;
        if s[i] &amp;gt;= max_substring[0]:&lt;br /&gt;
            max_substring = s[i] + max_substring&lt;br /&gt;
        else:&lt;br /&gt;
            max_substring += s[i]&lt;br /&gt;
    return max_substring&lt;br /&gt;
&lt;br /&gt;
def sum_of_max_substrings(s):&lt;br /&gt;
    total_sum = 0&lt;br /&gt;
    for i in range(len(s)):&lt;br /&gt;
        max_substring = max_lexicographic(s[i:])&lt;br /&gt;
        total_sum += len(max_substring)&lt;br /&gt;
        total_sum %= MOD&lt;br /&gt;
    return total_sum&lt;br /&gt;
&lt;br /&gt;
def main():&lt;br /&gt;
    s = input().strip()&lt;br /&gt;
    result = sum_of_max_substrings(s)&lt;br /&gt;
    print(result)&lt;br /&gt;
&lt;br /&gt;
if __name__ == &amp;quot;__main__&amp;quot;:&lt;br /&gt;
    main()&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>RebecaBud</name></author>
	</entry>
	<entry>
		<id>https://wiki.universitas.ro/index.php?title=3229_-_The_Grade&amp;diff=10037</id>
		<title>3229 - The Grade</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=3229_-_The_Grade&amp;diff=10037"/>
		<updated>2024-06-03T17:19:30Z</updated>

		<summary type="html">&lt;p&gt;RebecaBud: /* Rezolvare */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Enunt ==&lt;br /&gt;
Aleku Turcul este la ora de matematica. În timp ce el încearcă să-și dea seama dacă 1+1=2, profesorul scrie pe tablă o problemă ceva mai complicată. Se dau Q queryuri și o listă S cu P elemente egale cu 0. Notăm cu A un șir, care inițial este vid. Queryurile pot fi de forma:&lt;br /&gt;
- 0 x (inserează valoarea x în A)&lt;br /&gt;
- 1 x (șterge valoarea x din A; se garantează că există cel puțin o valoare de x în A)&lt;br /&gt;
Se garantează că A nu va fi niciodată vid după vreun query. După fiecare query profesorul îi pune lui Aleku următoarea întrebare: oare pot așeza în lista S toate numerele din A (nu neapărat în ordinea în care se află în A) astfel încât:&lt;br /&gt;
&lt;br /&gt;
elementele din A se vor așeza în S pe poziții distincte, restul pozițiilor din S fiind ocupate de elemente cu valoarea 0&lt;br /&gt;
fie S[i] un element nenul din S și S[j] cel mai apropiat element nenul care se află în stânga lui S[i] în S. Atunci următoarea condiție trebuie respectată: i - j ≥ S[i]&lt;br /&gt;
fie f poziția celui mai din stânga element nenul din S. Atunci f ≥ S[f].&lt;br /&gt;
Dacă răspunsul la întrebarea profesorului este da, atunci să se spună și câte configurații diferite se pot obține. Deoarece răspunsul la întrebare poate fi foarte mare, acesta se va afișa modulo 1.000.000.007. Dacă răspunsul este nu, se va afișa -1.&lt;br /&gt;
== Cerinţa ==&lt;br /&gt;
Ajutați-l pe Aleku sa răspundă corect la întrebările profesorului pentru ca sa obțină nota 10. Media lui depinde de aceasta!&lt;br /&gt;
== Date dePrima linie se vor citi de la tastatură două numere naturale Q și P. Pe următoarele Q linii se află Q query-uri sub forma descrisă în enunț.&lt;br /&gt;
== Date de ieșire ==&lt;br /&gt;
Se vor afișa pe ecran răspunsurile la cele Q query-uri, câte unul pe linie.&lt;br /&gt;
== Restricţii şi precizări ==&lt;br /&gt;
* 1 ≤ Q, P ≤ 100.000&lt;br /&gt;
* Răspunsurile se vor afișa modulo 1.000.000.007.&lt;br /&gt;
* Numerele ce vor fi adăugate/șterse la un query sunt mai mici sau egale decât 1.000.000.&lt;br /&gt;
* ATENȚIE! În cazul în care răspunsul unui query este NU, se va afișa -1.&lt;br /&gt;
* Aleku nu este turc. Turcul este numele lui. El este de fapt căpitan.&lt;br /&gt;
== Exemplul 1 ==&lt;br /&gt;
; Intrare&lt;br /&gt;
&lt;br /&gt;
  9 8&lt;br /&gt;
  0 3&lt;br /&gt;
  0 3&lt;br /&gt;
  0 2&lt;br /&gt;
  1 2&lt;br /&gt;
  0 1&lt;br /&gt;
  0 1&lt;br /&gt;
  0 1&lt;br /&gt;
  1 3&lt;br /&gt;
  1 1&lt;br /&gt;
; Ieșire&lt;br /&gt;
&lt;br /&gt;
  6&lt;br /&gt;
  6&lt;br /&gt;
  3&lt;br /&gt;
  6&lt;br /&gt;
  12&lt;br /&gt;
  6&lt;br /&gt;
  -1&lt;br /&gt;
  60&lt;br /&gt;
  60&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&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;gt;&lt;br /&gt;
MOD = 1000000007&lt;br /&gt;
&lt;br /&gt;
def get_configurations(A):&lt;br /&gt;
    config_count = 1&lt;br /&gt;
    last_nonzero_pos = -1&lt;br /&gt;
    for i in range(len(A)):&lt;br /&gt;
        if A[i] != 0:&lt;br /&gt;
            if i - last_nonzero_pos &amp;lt; A[i]:&lt;br /&gt;
                return 0&lt;br /&gt;
            last_nonzero_pos = i&lt;br /&gt;
        if last_nonzero_pos + 1 &amp;lt; A[0]:&lt;br /&gt;
            return 0&lt;br /&gt;
        if last_nonzero_pos == A[0] - 1:&lt;br /&gt;
            config_count *= 2&lt;br /&gt;
            config_count %= MOD&lt;br /&gt;
    return config_count&lt;br /&gt;
&lt;br /&gt;
def solve(Q, P, queries):&lt;br /&gt;
    A = []&lt;br /&gt;
    configurations = []&lt;br /&gt;
    result = []&lt;br /&gt;
&lt;br /&gt;
    for query in queries:&lt;br /&gt;
        if query[0] == 0:&lt;br /&gt;
            A.append(query[1])&lt;br /&gt;
        else:&lt;br /&gt;
            A.remove(query[1])&lt;br /&gt;
        configurations.append(get_configurations(A))&lt;br /&gt;
    &lt;br /&gt;
    for config in configurations:&lt;br /&gt;
        if config == 0:&lt;br /&gt;
            result.append(-1)&lt;br /&gt;
        else:&lt;br /&gt;
            result.append(config)&lt;br /&gt;
    &lt;br /&gt;
    return result&lt;br /&gt;
&lt;br /&gt;
def main():&lt;br /&gt;
    Q, P = map(int, input().split())&lt;br /&gt;
    queries = [list(map(int, input().split())) for _ in range(Q)]&lt;br /&gt;
&lt;br /&gt;
    result = solve(Q, P, queries)&lt;br /&gt;
&lt;br /&gt;
    for res in result:&lt;br /&gt;
        print(res)&lt;br /&gt;
&lt;br /&gt;
if __name__ == &amp;quot;__main__&amp;quot;:&lt;br /&gt;
    main()&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>RebecaBud</name></author>
	</entry>
	<entry>
		<id>https://wiki.universitas.ro/index.php?title=3229_-_The_Grade&amp;diff=10036</id>
		<title>3229 - The Grade</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=3229_-_The_Grade&amp;diff=10036"/>
		<updated>2024-06-03T17:19:15Z</updated>

		<summary type="html">&lt;p&gt;RebecaBud: Pagină nouă: == Enunt == Aleku Turcul este la ora de matematica. În timp ce el încearcă să-și dea seama dacă 1+1=2, profesorul scrie pe tablă o problemă ceva mai complicată. Se dau Q queryuri și o listă S cu P elemente egale cu 0. Notăm cu A un șir, care inițial este vid. Queryurile pot fi de forma: - 0 x (inserează valoarea x în A) - 1 x (șterge valoarea x din A; se garantează că există cel puțin o valoare de x în A) Se garantează că A nu va fi niciodată vid dup...&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Enunt ==&lt;br /&gt;
Aleku Turcul este la ora de matematica. În timp ce el încearcă să-și dea seama dacă 1+1=2, profesorul scrie pe tablă o problemă ceva mai complicată. Se dau Q queryuri și o listă S cu P elemente egale cu 0. Notăm cu A un șir, care inițial este vid. Queryurile pot fi de forma:&lt;br /&gt;
- 0 x (inserează valoarea x în A)&lt;br /&gt;
- 1 x (șterge valoarea x din A; se garantează că există cel puțin o valoare de x în A)&lt;br /&gt;
Se garantează că A nu va fi niciodată vid după vreun query. După fiecare query profesorul îi pune lui Aleku următoarea întrebare: oare pot așeza în lista S toate numerele din A (nu neapărat în ordinea în care se află în A) astfel încât:&lt;br /&gt;
&lt;br /&gt;
elementele din A se vor așeza în S pe poziții distincte, restul pozițiilor din S fiind ocupate de elemente cu valoarea 0&lt;br /&gt;
fie S[i] un element nenul din S și S[j] cel mai apropiat element nenul care se află în stânga lui S[i] în S. Atunci următoarea condiție trebuie respectată: i - j ≥ S[i]&lt;br /&gt;
fie f poziția celui mai din stânga element nenul din S. Atunci f ≥ S[f].&lt;br /&gt;
Dacă răspunsul la întrebarea profesorului este da, atunci să se spună și câte configurații diferite se pot obține. Deoarece răspunsul la întrebare poate fi foarte mare, acesta se va afișa modulo 1.000.000.007. Dacă răspunsul este nu, se va afișa -1.&lt;br /&gt;
== Cerinţa ==&lt;br /&gt;
Ajutați-l pe Aleku sa răspundă corect la întrebările profesorului pentru ca sa obțină nota 10. Media lui depinde de aceasta!&lt;br /&gt;
== Date dePrima linie se vor citi de la tastatură două numere naturale Q și P. Pe următoarele Q linii se află Q query-uri sub forma descrisă în enunț.&lt;br /&gt;
== Date de ieșire ==&lt;br /&gt;
Se vor afișa pe ecran răspunsurile la cele Q query-uri, câte unul pe linie.&lt;br /&gt;
== Restricţii şi precizări ==&lt;br /&gt;
* 1 ≤ Q, P ≤ 100.000&lt;br /&gt;
* Răspunsurile se vor afișa modulo 1.000.000.007.&lt;br /&gt;
* Numerele ce vor fi adăugate/șterse la un query sunt mai mici sau egale decât 1.000.000.&lt;br /&gt;
* ATENȚIE! În cazul în care răspunsul unui query este NU, se va afișa -1.&lt;br /&gt;
* Aleku nu este turc. Turcul este numele lui. El este de fapt căpitan.&lt;br /&gt;
== Exemplul 1 ==&lt;br /&gt;
; Intrare&lt;br /&gt;
&lt;br /&gt;
  9 8&lt;br /&gt;
  0 3&lt;br /&gt;
  0 3&lt;br /&gt;
  0 2&lt;br /&gt;
  1 2&lt;br /&gt;
  0 1&lt;br /&gt;
  0 1&lt;br /&gt;
  0 1&lt;br /&gt;
  1 3&lt;br /&gt;
  1 1&lt;br /&gt;
; Ieșire&lt;br /&gt;
&lt;br /&gt;
  6&lt;br /&gt;
  6&lt;br /&gt;
  3&lt;br /&gt;
  6&lt;br /&gt;
  12&lt;br /&gt;
  6&lt;br /&gt;
  -1&lt;br /&gt;
  60&lt;br /&gt;
  60&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&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;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>RebecaBud</name></author>
	</entry>
	<entry>
		<id>https://wiki.universitas.ro/index.php?title=2654_-_Sort_All&amp;diff=10034</id>
		<title>2654 - Sort All</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=2654_-_Sort_All&amp;diff=10034"/>
		<updated>2024-06-03T17:16:37Z</updated>

		<summary type="html">&lt;p&gt;RebecaBud: Pagină nouă: == Enunt ==  Pentru un șir de numere A  se definește următoarea funcție de cost: f(A)=1⋅v1+2⋅v2+…+k⋅vk , unde [v1,v2,…,vk]  sunt valorile distincte ale lui A , ordonate crescător. == Cerinţa == Fiind dat un șir de N numere naturale A, să se calculeze suma aplicării funcției f pe toate subsecvențele lui A (i.e. suma după (1 ≤ i ≤ j ≤ N) din f(A[i...j]), unde A[i…j] este subsecvența de la i la j). == Date de intrare == Fișierul sortall.in conțin...&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Enunt == &lt;br /&gt;
Pentru un șir de numere A&lt;br /&gt;
 se definește următoarea funcție de cost: f(A)=1⋅v1+2⋅v2+…+k⋅vk&lt;br /&gt;
, unde [v1,v2,…,vk]&lt;br /&gt;
 sunt valorile distincte ale lui A&lt;br /&gt;
, ordonate crescător.&lt;br /&gt;
== Cerinţa ==&lt;br /&gt;
Fiind dat un șir de N numere naturale A, să se calculeze suma aplicării funcției f pe toate subsecvențele lui A (i.e. suma după (1 ≤ i ≤ j ≤ N) din f(A[i...j]), unde A[i…j] este subsecvența de la i la j).&lt;br /&gt;
== Date de intrare ==&lt;br /&gt;
Fișierul sortall.in conține pe prima linie numărul natural N. Linia a doua conține N numere naturale separate prin spațiu, reprezentând elementele șirului A.&lt;br /&gt;
== Date de ieșire ==&lt;br /&gt;
Fișierul sortall.out va conține răspunsul modulo 1 000 000 007.&lt;br /&gt;
== Restricţii şi precizări ==&lt;br /&gt;
* 1 ≤ N ≤ 50 000&lt;br /&gt;
* 1 ≤ Vi ≤ N&lt;br /&gt;
* Pentru 10 puncte 1 ≤ N ≤ 100&lt;br /&gt;
* Pentru alte 15 puncte 1 ≤ N ≤ 1000&lt;br /&gt;
* Pentru alte 15 puncte 1 ≤ N ≤ 5000&lt;br /&gt;
* Pentru alte 20 de puncte se garanteză că valorile din șir sunt distincte&lt;br /&gt;
== Exemplul 1 ==&lt;br /&gt;
; sortall.in&lt;br /&gt;
&lt;br /&gt;
  3&lt;br /&gt;
  1 3 2&lt;br /&gt;
; sortall.out&lt;br /&gt;
&lt;br /&gt;
  35&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Exemplul 2 ==&lt;br /&gt;
; sortall.in&lt;br /&gt;
&lt;br /&gt;
  8&lt;br /&gt;
  4 3 4 4 7 1 2 1&lt;br /&gt;
; sortall.out&lt;br /&gt;
&lt;br /&gt;
  864&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;gt;&lt;br /&gt;
MOD = 1000000007&lt;br /&gt;
&lt;br /&gt;
def solve(N, A):&lt;br /&gt;
    freq = {}&lt;br /&gt;
    total_sum = 0&lt;br /&gt;
&lt;br /&gt;
    for i in range(N):&lt;br /&gt;
        curr_sum = 0&lt;br /&gt;
&lt;br /&gt;
        for num in freq:&lt;br /&gt;
            if num &amp;lt;= A[i]:&lt;br /&gt;
                curr_sum += (i - freq[num] + 1) * num * (freq[num] - freq.get(num - 1, 0))&lt;br /&gt;
                curr_sum %= MOD&lt;br /&gt;
&lt;br /&gt;
        total_sum += curr_sum&lt;br /&gt;
        total_sum %= MOD&lt;br /&gt;
&lt;br /&gt;
        freq[A[i]] = i + 1&lt;br /&gt;
&lt;br /&gt;
    return total_sum&lt;br /&gt;
&lt;br /&gt;
def main():&lt;br /&gt;
    with open(&amp;quot;sortall.in&amp;quot;, &amp;quot;r&amp;quot;) as fin:&lt;br /&gt;
        N = int(fin.readline())&lt;br /&gt;
        A = list(map(int, fin.readline().split()))&lt;br /&gt;
&lt;br /&gt;
    result = solve(N, A)&lt;br /&gt;
&lt;br /&gt;
    with open(&amp;quot;sortall.out&amp;quot;, &amp;quot;w&amp;quot;) as fout:&lt;br /&gt;
        fout.write(str(result) + &amp;quot;\n&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
if __name__ == &amp;quot;__main__&amp;quot;:&lt;br /&gt;
    main()&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>RebecaBud</name></author>
	</entry>
	<entry>
		<id>https://wiki.universitas.ro/index.php?title=4026_-_Order&amp;diff=10033</id>
		<title>4026 - Order</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=4026_-_Order&amp;diff=10033"/>
		<updated>2024-06-03T17:14:22Z</updated>

		<summary type="html">&lt;p&gt;RebecaBud: Pagină nouă: == Enunt ==  Se consideră toate şirurile finite de numere naturale nenule ordonate astfel: [1]; [1,1]; [2]; [1,1,1]; [1,2]; [2,1]; [3]; [1,1,1,1]; [1,1,2]; [1,2,1]; [1,3]; ... Ordonarea se face după următoarea regulă: dacă avem două şiruri cu sumele termenilor diferite, atunci şirul cu suma termenilor mai mică se găseşte pe o poziţie mai mică. Dacă avem două şiruri cu sumele termenilor egale atunci se compară termen cu termen şirurile până când se găse...&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Enunt == &lt;br /&gt;
Se consideră toate şirurile finite de numere naturale nenule ordonate astfel:&lt;br /&gt;
[1]; [1,1]; [2]; [1,1,1]; [1,2]; [2,1]; [3]; [1,1,1,1]; [1,1,2]; [1,2,1]; [1,3]; ...&lt;br /&gt;
Ordonarea se face după următoarea regulă: dacă avem două şiruri cu sumele termenilor diferite, atunci şirul cu suma termenilor mai mică se găseşte pe o poziţie mai mică.&lt;br /&gt;
Dacă avem două şiruri cu sumele termenilor egale atunci se compară termen cu termen şirurile până când se găseşte un termen diferit.&lt;br /&gt;
Şirul care are termenul mai mic se găseşte pe poziţie mai mică. Cu alte cuvinte, primul criteriu de ordonare este suma termenilor, iar în caz de egalitate, al doilea criteriu de sortare este ordinea lexicografică.&lt;br /&gt;
Oricărui şir i se asociază o poziţie (număr natural nenul) şi invers, oricărei poziţii i se asociază un şir.&lt;br /&gt;
&lt;br /&gt;
De exemplu:&lt;br /&gt;
&lt;br /&gt;
* Şirului [1,1,2] i se asociază poziţia 9.&lt;br /&gt;
* Poziţiei 14 i se asociază şirul [3,1].&lt;br /&gt;
== Cerinţa ==&lt;br /&gt;
Să se răspundă la un număr de interogări de tipul:&lt;br /&gt;
1. Cunoscând un şir de numere naturale nenule să se determine poziţia asociată şirului.&lt;br /&gt;
2. Cunoscând un număr natural reprezentând o poziţie asociată unui şir să se determine şirul corespunzător.&lt;br /&gt;
== Date de intrare ==&lt;br /&gt;
Fişierul de intrare order3.in conţine pe prima linie un număr natural Q reprezentând numărul de interogări.&lt;br /&gt;
Pe următoarele Q linii vor fi descrise interogările.&lt;br /&gt;
Dacă interogarea este de tip 1 linia va conţine numărul 1, apoi un număr natural N reprezentând numărul de termeni ai şirului urmat de N numere naturale separate prin cűte un spaţiu reprezentând termenii şirului.&lt;br /&gt;
Dacă interogarea este de tip 2 linia va conţine numărul 2 urmat de un număr natural nenul P reprezentând poziţia şirului solicitat.&lt;br /&gt;
== Date de ieșire ==&lt;br /&gt;
Fişierul de ieşire order3.out va conţine Q linii. Pe fiecare linie este descris răspunsul la interogarea corespunzătoare din fişierul de intrare.&lt;br /&gt;
Dacă interogarea este de tip 1, pe linia corespunzătoare se va afişa un singur număr P reprezentând poziţia şirului descris în interogare.&lt;br /&gt;
Dacă interogarea este de tip 2, linia corespunzătoare va conţine un număr natural N@ reprezentând numărul de termeni pentru şirul solicitat, urmat de N numere naturale nenule reprezentând termenii şirului. Numerele de pe aceste linii trebuie sa fie separate prin câte un spaţiu.&lt;br /&gt;
== Restricţii şi precizări ==&lt;br /&gt;
* 1 ≤ P ≤ 1015 (mai precis se asigură ca pentru ambele tipuri de interogări poziţia asociată şirului considerat nu depăşeşte 1015).&lt;br /&gt;
* 1 ≤ Q ≤ 105.&lt;br /&gt;
* Pentru 40 de puncte testele vor conţine doar interogări de tip 1.&lt;br /&gt;
* Pentru 40 de puncte testele vor conţine doar interogări de tip 2.&lt;br /&gt;
* Pentru 20 de puncte testele vor conţine interogări de ambele tipuri.&lt;br /&gt;
== Exemplul 1 ==&lt;br /&gt;
; order.in&lt;br /&gt;
&lt;br /&gt;
  2&lt;br /&gt;
  1 3 1 1 2&lt;br /&gt;
  2 14&lt;br /&gt;
; order.out&lt;br /&gt;
&lt;br /&gt;
  9&lt;br /&gt;
  2 3 1&lt;br /&gt;
== Explicație ==&lt;br /&gt;
Fişierul de intrare conţine două interogări. Prima este de tip 1 şi cere determinarea poziţiei şirului [1,1,2] care are lungimea 3. Acest şir este pe poziţia a 9-a conform ordinii descrise în enunţ. A doua interogare cere determinarea şirului aflat pe poziţia 14. Acest şir este şirul [3,1] de lungime 2.&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;gt;&lt;br /&gt;
def fibonacci(n):&lt;br /&gt;
    fib = [1, 1]&lt;br /&gt;
    while len(fib) &amp;lt; n:&lt;br /&gt;
        fib.append(fib[-1] + fib[-2])&lt;br /&gt;
    return fib&lt;br /&gt;
&lt;br /&gt;
def find_position(sequence):&lt;br /&gt;
    n = len(sequence)&lt;br /&gt;
    fib = fibonacci(n + 2)&lt;br /&gt;
    prefix_sum = [0] * (n + 1)&lt;br /&gt;
    for i in range(1, n + 1):&lt;br /&gt;
        prefix_sum[i] = prefix_sum[i - 1] + fib[i]&lt;br /&gt;
    position = prefix_sum[n]&lt;br /&gt;
    for i in range(n):&lt;br /&gt;
        position += sequence[i] - 1&lt;br /&gt;
        for j in range(1, sequence[i]):&lt;br /&gt;
            position += fib[n - i - 1]&lt;br /&gt;
    return position&lt;br /&gt;
&lt;br /&gt;
def find_sequence(position):&lt;br /&gt;
    fib = fibonacci(100)&lt;br /&gt;
    n = len(fib)&lt;br /&gt;
    sequence = []&lt;br /&gt;
    for i in range(n - 1, -1, -1):&lt;br /&gt;
        if position &amp;gt; fib[i]:&lt;br /&gt;
            sequence.append(i + 1)&lt;br /&gt;
            position -= fib[i]&lt;br /&gt;
    return sequence&lt;br /&gt;
&lt;br /&gt;
def main():&lt;br /&gt;
    with open(&amp;quot;order3.in&amp;quot;, &amp;quot;r&amp;quot;) as fin:&lt;br /&gt;
        Q = int(fin.readline())&lt;br /&gt;
        queries = [list(map(int, line.split())) for line in fin.readlines()]&lt;br /&gt;
&lt;br /&gt;
    with open(&amp;quot;order3.out&amp;quot;, &amp;quot;w&amp;quot;) as fout:&lt;br /&gt;
        for query in queries:&lt;br /&gt;
            if query[0] == 1:&lt;br /&gt;
                sequence = query[2:]&lt;br /&gt;
                position = find_position(sequence)&lt;br /&gt;
                fout.write(str(position) + &amp;quot;\n&amp;quot;)&lt;br /&gt;
            elif query[0] == 2:&lt;br /&gt;
                position = query[1]&lt;br /&gt;
                sequence = find_sequence(position)&lt;br /&gt;
                fout.write(f&amp;quot;{len(sequence)} {&#039; &#039;.join(map(str, sequence))}\n&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
if __name__ == &amp;quot;__main__&amp;quot;:&lt;br /&gt;
    main()&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>RebecaBud</name></author>
	</entry>
	<entry>
		<id>https://wiki.universitas.ro/index.php?title=2053_-_Fibo_Div&amp;diff=10031</id>
		<title>2053 - Fibo Div</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=2053_-_Fibo_Div&amp;diff=10031"/>
		<updated>2024-06-03T17:12:25Z</updated>

		<summary type="html">&lt;p&gt;RebecaBud: Pagină nouă: == Enunt == Fie șirul Fibonacci, dat prin F[1] = 1, F[2] = 1 și relația de recurență F[k] = F[k-1] + F[k-2], k ≥ 3 . Se consideră un număr natural N și un șir A[1], A[2],...,A[N] de N numere naturale distincte. Se consideră de asemenea și un număr natural T. == Cerinţa == Să se scrie un program care determină o valoare D ce reprezintă numărul termenilor din șirul Fibonacci F[1], F[2] ,..., F[T] care sunt divizibili cu cel puțin unul dintre numerele A[1],...&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Enunt ==&lt;br /&gt;
Fie șirul Fibonacci, dat prin F[1] = 1, F[2] = 1 și relația de recurență F[k] = F[k-1] + F[k-2], k ≥ 3 . Se consideră un număr natural N și un șir A[1], A[2],...,A[N] de N numere naturale distincte. Se consideră de asemenea și un număr natural T.&lt;br /&gt;
== Cerinţa ==&lt;br /&gt;
Să se scrie un program care determină o valoare D ce reprezintă numărul termenilor din șirul Fibonacci F[1], F[2] ,..., F[T] care sunt divizibili cu cel puțin unul dintre numerele A[1], A[2],...,A[N].&lt;br /&gt;
== Date de intrare ==&lt;br /&gt;
Fișierul de intrare fibodiv.in conţine pe prima linie numerele N și T separate printr-un spațiu, iar pe a doua linie N numere naturale, A[1], A[2],...,A[N], separate prin câte un spațiu.&lt;br /&gt;
== Date de ieșire ==&lt;br /&gt;
Fișierul de ieșire fibodiv.out va conţine pe prima linie numărul natural D,cu semnificația de mai sus.&lt;br /&gt;
== Restricţii şi precizări ==&lt;br /&gt;
* &#039;&#039;&#039;1 ≤ N ≤ 15&#039;&#039;&#039;&lt;br /&gt;
* &#039;&#039;&#039;2 ≤ T ≤ 1018&#039;&#039;&#039;&lt;br /&gt;
* &#039;&#039;&#039;2 ≤ A[i] ≤ 50, 1 ≤ i ≤ N&#039;&#039;&#039;&lt;br /&gt;
== Exemplul 1 ==&lt;br /&gt;
; fibodiv.in&lt;br /&gt;
&lt;br /&gt;
  3 20&lt;br /&gt;
  3 6 10&lt;br /&gt;
; fibodiv.out&lt;br /&gt;
&lt;br /&gt;
  6&lt;br /&gt;
== Explicație ==&lt;br /&gt;
N = 3; T = 20; A1 = 3, A2 = 6, A3 = 10. Primii 20 de termeni ai șirului Fibonacci sunt: 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377, 610, 987, 1597, 2584, 4181, 6765. Printre aceștia se găsesc 6 termeni divizibili cu cel puțin unul dintre numerele 3, 6, 10 și anume: 3, 21, 144, 610, 987, 6765.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&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;gt;&lt;br /&gt;
def fibonacci_sequence(n):&lt;br /&gt;
    fib = [1, 1]&lt;br /&gt;
    for i in range(2, n):&lt;br /&gt;
        fib.append(fib[i - 1] + fib[i - 2])&lt;br /&gt;
    return fib&lt;br /&gt;
&lt;br /&gt;
def count_divisible_terms(fib_sequence, divisors):&lt;br /&gt;
    count = 0&lt;br /&gt;
    for term in fib_sequence:&lt;br /&gt;
        for divisor in divisors:&lt;br /&gt;
            if term % divisor == 0:&lt;br /&gt;
                count += 1&lt;br /&gt;
                break&lt;br /&gt;
    return count&lt;br /&gt;
&lt;br /&gt;
def main():&lt;br /&gt;
    with open(&amp;quot;fibodiv.in&amp;quot;, &amp;quot;r&amp;quot;) as fin:&lt;br /&gt;
        N, T = map(int, fin.readline().split())&lt;br /&gt;
        divisors = list(map(int, fin.readline().split()))&lt;br /&gt;
&lt;br /&gt;
    fib_sequence = fibonacci_sequence(T)&lt;br /&gt;
    count = count_divisible_terms(fib_sequence, divisors)&lt;br /&gt;
&lt;br /&gt;
    with open(&amp;quot;fibodiv.out&amp;quot;, &amp;quot;w&amp;quot;) as fout:&lt;br /&gt;
        fout.write(str(count) + &amp;quot;\n&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
if __name__ == &amp;quot;__main__&amp;quot;:&lt;br /&gt;
    main()&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>RebecaBud</name></author>
	</entry>
	<entry>
		<id>https://wiki.universitas.ro/index.php?title=1896_-_K_Sir&amp;diff=10030</id>
		<title>1896 - K Sir</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=1896_-_K_Sir&amp;diff=10030"/>
		<updated>2024-06-03T17:10:31Z</updated>

		<summary type="html">&lt;p&gt;RebecaBud: Pagină nouă:  == Cerinţa == Fie S un șir de caractere cu litere mici și litere mari. Se sortează în ordine lexicografică toate subsecvențele distincte ale lui S. Se dă un număr K și un vector k cu K numere întregi, se cere pentru fiecare număr cel de ki -lea subșir lexicografic. == Date de intrare == Fișierul de intrare ksir.in conține pe prima linie un șir S, pe a doua linie un număr K, iar pe următoarea linie K numere naturale separate prin spații. == Date de ieșire...&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
== Cerinţa ==&lt;br /&gt;
Fie S un șir de caractere cu litere mici și litere mari. Se sortează în ordine lexicografică toate subsecvențele distincte ale lui S. Se dă un număr K și un vector k cu K numere întregi, se cere pentru fiecare număr cel de ki -lea subșir lexicografic.&lt;br /&gt;
== Date de intrare ==&lt;br /&gt;
Fișierul de intrare ksir.in conține pe prima linie un șir S, pe a doua linie un număr K, iar pe următoarea linie K numere naturale separate prin spații.&lt;br /&gt;
== Date de ieșire ==&lt;br /&gt;
Fișierul de ieșire ksir.out va conține cele K șiruri de caractere, câte unul pe fiecare linie.&lt;br /&gt;
== Restricţii şi precizări ==&lt;br /&gt;
* |S| ≤ 200000&lt;br /&gt;
* suma |ki | ≤ 200000&lt;br /&gt;
== Exemplul 1 ==&lt;br /&gt;
; ksir.in&lt;br /&gt;
&lt;br /&gt;
  FORR&lt;br /&gt;
  6&lt;br /&gt;
  1 1 2 3 4 5&lt;br /&gt;
; ksir.out&lt;br /&gt;
&lt;br /&gt;
  F&lt;br /&gt;
  F&lt;br /&gt;
  FO&lt;br /&gt;
  FOR&lt;br /&gt;
  FORR&lt;br /&gt;
  O&lt;br /&gt;
== Explicație ==&lt;br /&gt;
Subsecvențele pentru FORR sunt {&#039;F&#039;, &#039;FO&#039;, &#039;FOR&#039;, &#039;FORR&#039;, &#039;O&#039;, &#039;OR&#039;, &#039;ORR&#039;, &#039;R&#039;, &#039;RR&#039;}.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&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;gt;&lt;br /&gt;
def generate_subsequences(s):&lt;br /&gt;
    subsequences = set()&lt;br /&gt;
    n = len(s)&lt;br /&gt;
    for i in range(n):&lt;br /&gt;
        for j in range(i+1, n+1):&lt;br /&gt;
            subsequences.add(s[i:j])&lt;br /&gt;
    return sorted(subsequences)&lt;br /&gt;
&lt;br /&gt;
def main():&lt;br /&gt;
    with open(&amp;quot;ksir.in&amp;quot;, &amp;quot;r&amp;quot;) as fin:&lt;br /&gt;
        s = fin.readline().strip()&lt;br /&gt;
        K = int(fin.readline().strip())&lt;br /&gt;
        k_values = list(map(int, fin.readline().split()))&lt;br /&gt;
&lt;br /&gt;
    subsequences = generate_subsequences(s)&lt;br /&gt;
&lt;br /&gt;
    with open(&amp;quot;ksir.out&amp;quot;, &amp;quot;w&amp;quot;) as fout:&lt;br /&gt;
        for k in k_values:&lt;br /&gt;
            fout.write(subsequences[k - 1] + &amp;quot;\n&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
if __name__ == &amp;quot;__main__&amp;quot;:&lt;br /&gt;
    main()&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>RebecaBud</name></author>
	</entry>
	<entry>
		<id>https://wiki.universitas.ro/index.php?title=1648_-_Diez&amp;diff=10028</id>
		<title>1648 - Diez</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=1648_-_Diez&amp;diff=10028"/>
		<updated>2024-06-03T17:08:46Z</updated>

		<summary type="html">&lt;p&gt;RebecaBud: Pagină nouă: == Enunt ==  Negrimon a găsit într-o culegere această problemă #legendară: peste un şir de caractere de lungime N, alcătuit din litere mici ale alfabetului englez, se efectuează M operaţii de următoarele tipuri:  Se inserează în şir caracterul x, pe poziţia p, după deplasarea cu o poziţie la dreapta a caracterelor situate pe poziţiile mai mari sau egale cu p. Dacă valoarea p este egală cu lungimea şirului, x este alipit la finalul şirului. Se răspunde cu...&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Enunt ==&lt;br /&gt;
&lt;br /&gt;
Negrimon a găsit într-o culegere această problemă #legendară: peste un şir de caractere de lungime N, alcătuit din litere mici ale alfabetului englez, se efectuează M operaţii de următoarele tipuri:&lt;br /&gt;
&lt;br /&gt;
Se inserează în şir caracterul x, pe poziţia p, după deplasarea cu o poziţie la dreapta a caracterelor situate pe poziţiile mai mari sau egale cu p. Dacă valoarea p este egală cu lungimea şirului, x este alipit la finalul şirului.&lt;br /&gt;
Se răspunde cu 1 dacă secvenţa de litere care începe la poziţia q1 şi are lungimea lg coincide literă cu literă, cu secvenţa care începe la poziţia q2 şi are aceeaşi lungime lg şi se răspunde cu 0 în caz contrar. Este posibil ca cele două secvenţe să se suprapună complet sau parţial în şirul din care ele fac parte.&lt;br /&gt;
== Cerinţa ==&lt;br /&gt;
Fiind dat un şir de N litere mici şi o listă de M operaţii, să se afişeze răspunsurile la operaţiile de tip 2, respectând ordinea din succesiunea de operaţii date.&lt;br /&gt;
== Date de intrare ==&lt;br /&gt;
Fișierul de intrare diez.in conține pe prima linie valorile N şi M, separate printr-un spaţiu cu semnificaţia din enunţ. Pe a doua linie se află un şir de N litere mici ale alfabetului englez iar următoarele M linii conţin câte o operaţie în unul dintre formatele:&lt;br /&gt;
&lt;br /&gt;
* 1 p x – Datele pentru operaţia de tipul 1.&lt;br /&gt;
* 2 q1 q2 lg – Datele pentru operaţia de tipul 2.&lt;br /&gt;
== Date de ieșire ==&lt;br /&gt;
În fișierul de ieșire diez.out se vor scrie valori egale cu 0 sau 1, câte una pe o linie, reprezentând răspunsurile date, în ordine, la operaţiile de tipul 2 existente în fişierul de intrare.&lt;br /&gt;
== Restricţii şi precizări ==&lt;br /&gt;
* 1 ≤ N, M ≤ 250 000&lt;br /&gt;
* 0 ≤ p ≤ lungimea şirului la momentul inserării&lt;br /&gt;
* x este literă mică a alfabetului englez&lt;br /&gt;
* q1, q2 ≥ 0; se garantează că pentru fiecare operaţie de tipul 2 există lg caractere în şir începând atât cu *poziţia q1 cât şi cu poziţia q2&lt;br /&gt;
* 1 &amp;lt; lg ≤ lungimea şirului la momentul efectuării operaţiei de tipul 2&lt;br /&gt;
* Numerotarea caracterelor din şir începe de la poziţia 0&lt;br /&gt;
== Exemplul 1 ==&lt;br /&gt;
; diez.in&lt;br /&gt;
&lt;br /&gt;
  8 6&lt;br /&gt;
  abcasfas&lt;br /&gt;
  2 0 5 3&lt;br /&gt;
  1 3 d&lt;br /&gt;
  2 4 7 2&lt;br /&gt;
  1 1 s&lt;br /&gt;
  1 10 b&lt;br /&gt;
  2 0 8 3&lt;br /&gt;
; diez.out&lt;br /&gt;
&lt;br /&gt;
  0&lt;br /&gt;
  1&lt;br /&gt;
  1&lt;br /&gt;
== Explicație ==&lt;br /&gt;
Se compară secvenţele abc şi fas care sunt diferite → se afişează 0&lt;br /&gt;
Caracterul d este inserat înainte de poziţia 3 şi se obţine şirul abcdasfas&lt;br /&gt;
Se compară subşirurile as şi as, sunt identice → se afişează 1&lt;br /&gt;
Caracterul s este inserat înainte de poziţia 1, se obţine şirul asbcdasfas&lt;br /&gt;
Caracterul b este inserat pe poziţia 10, poziţia este egală cu lungimea şirului, se obţine şirul asbcdasfasb&lt;br /&gt;
Se compară subşirurile asb si asb , sunt identice → se afişează 1&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Exemplul 2 ==&lt;br /&gt;
; diez.in&lt;br /&gt;
&lt;br /&gt;
  6 3&lt;br /&gt;
  atmatm&lt;br /&gt;
  2 0 2 4&lt;br /&gt;
  1 6 a&lt;br /&gt;
  2 0 3 4&lt;br /&gt;
; diez.out&lt;br /&gt;
&lt;br /&gt;
  0&lt;br /&gt;
  1&lt;br /&gt;
== Explicație ==&lt;br /&gt;
Se compară subşirurile atma şi matm, sunt diferite → se afişează 0&lt;br /&gt;
Caracterul a se alipeşte la final, se obţine şirul atmatma&lt;br /&gt;
Se compară subşirurile atma atma, sunt identice → se afişează 1&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;gt;&lt;br /&gt;
def compare_substrings(string, q1, q2, lg):&lt;br /&gt;
    return string[q1:q1+lg] == string[q2:q2+lg]&lt;br /&gt;
&lt;br /&gt;
def main():&lt;br /&gt;
    with open(&amp;quot;diez.in&amp;quot;, &amp;quot;r&amp;quot;) as fin:&lt;br /&gt;
        N, M = map(int, fin.readline().split())&lt;br /&gt;
        string = fin.readline().strip()&lt;br /&gt;
        operations = [list(map(str, fin.readline().split())) for _ in range(M)]&lt;br /&gt;
&lt;br /&gt;
    for op in operations:&lt;br /&gt;
        if op[0] == &#039;2&#039;:&lt;br /&gt;
            q1, q2, lg = map(int, op[1:])&lt;br /&gt;
            result = compare_substrings(string, q1, q2, lg)&lt;br /&gt;
            print(result)&lt;br /&gt;
&lt;br /&gt;
if __name__ == &amp;quot;__main__&amp;quot;:&lt;br /&gt;
    main()&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>RebecaBud</name></author>
	</entry>
	<entry>
		<id>https://wiki.universitas.ro/index.php?title=1829_-_Cuvinte_Ascunse&amp;diff=10026</id>
		<title>1829 - Cuvinte Ascunse</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=1829_-_Cuvinte_Ascunse&amp;diff=10026"/>
		<updated>2024-06-03T17:05:59Z</updated>

		<summary type="html">&lt;p&gt;RebecaBud: /* Enunt */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Enunt ==&lt;br /&gt;
Programatoarea Petra a început un curs de criptografie. Fiind un spirit creativ, Petra a creat deja o metodă elaborată de criptare a unei parole sub forma unei perechi (tabel de litere aparţinând mulţimii {‘a’...’z’}, dicţionar de cuvinte). Din păcate pentru Petra, metoda ei de criptare a parolei, poate fi decriptată de oricine astfel:&lt;br /&gt;
* se iau tabelul de litere şi dicţionarul de cuvinte permise&lt;br /&gt;
* se listează, sortează şi numără toate cuvintele care se găsesc în tabel. Un cuvânt c1c2…ckcare există în dicţionar există şi în tabel dacă fiecare literă ci apare în tabel şi pentru i&amp;gt;1, cieste vecină în tabel cu litera ci−1.&lt;br /&gt;
* din lista sortata de T perechi (cuvânti, ai), unde cuvântieste un cuvânt iar ai este numărul de apariţii în tabel, reconstituie litera pi a parolei astfel: pi=‘a’ + ( aimod 26). Încercând să îmbunătăţească algoritmul, Petra a decis să înlocuiască unele litere din tabel cu semnul întrebării &#039;?&#039;. Un semn &#039;?&#039; poate fi înlocuit cu orice literă când se parcurge tabelul. Convinge-o pe Petra că, în ciuda îmbunătăţirii, îi poţi găsi parola pornind de la orice pereche de (dicţionar, tabel de litere) dată.&lt;br /&gt;
&lt;br /&gt;
== Cerinţa ==&lt;br /&gt;
Dat fiind un tabel de litere de dimensiuni N x M, şi o listă a cuvintelor din dicţionar, să se afişeze lista sortată de T perechi de forma &#039;ci: ai&#039; şi parola Petrei.&lt;br /&gt;
== Date de intrare ==&lt;br /&gt;
Fişierul cuvinteascunse.in va conţine N + C + 1 linii. Pe prima linie N, M, C – dimensiunile tabelului, şi numărul de cuvinte din dicţionar. Apoi cele N linii ale tabelului:&lt;br /&gt;
t1,1 ...t1,m&lt;br /&gt;
t2,1 ...t2,m&lt;br /&gt;
. . .&lt;br /&gt;
tn,1 ...tn,m&lt;br /&gt;
urmate de cele C cuvinte din dicţionar, fiecare pe o linie:&lt;br /&gt;
cuvânt1&lt;br /&gt;
cuvânt2&lt;br /&gt;
. . .&lt;br /&gt;
cuvântC&lt;br /&gt;
== Date de ieșire ==&lt;br /&gt;
Fişierul cuvinteascunse.out va conţine pe prima linie T, numărul de cuvinte distincte găsite în tabel. Pe următoarele T linii se vor afla perechi cuvânti ai separate printr-un spaţiu. Pe ultima linie se va afla un şir de caractere reprezentand parola Petrei.&lt;br /&gt;
== Restricţii şi precizări ==&lt;br /&gt;
* O secvenţă de litere reprezintă un cuvânt dacă se află în dicţionarul dat ca date de intrare. Dicţionarul conţine cuvinte formate din litere aparţinând mulţimii {‘a’...’z’}U{‘A’...’Z’}. Literele mici şi cele mari se consideră egale. Două litere sunt vecine în tabel, dacă celulele lor au o latura sau un colţ comun. Aceeaşi litera din tabel se poate folosi de mai multe ori într-un cuvânt. Dacă acelaşi semn &#039;?&#039; este folosit de mai multe ori într-un cuvânt, trebuie să reprezinte aceeaşi literă de fiecare dată.&lt;br /&gt;
* 0 &amp;lt; N &amp;lt; 6&lt;br /&gt;
* 0 &amp;lt; M &amp;lt; 6&lt;br /&gt;
* 0 &amp;lt; C &amp;lt; 20000&lt;br /&gt;
== Exemplul 1 ==&lt;br /&gt;
; cuvinteascunse.in&lt;br /&gt;
&lt;br /&gt;
  2 2 3&lt;br /&gt;
  e a&lt;br /&gt;
  l ?&lt;br /&gt;
  ea&lt;br /&gt;
  elena&lt;br /&gt;
  arc&lt;br /&gt;
; cuvinteascunse.out&lt;br /&gt;
&lt;br /&gt;
  2&lt;br /&gt;
  ea 3&lt;br /&gt;
  elena 1&lt;br /&gt;
  db&lt;br /&gt;
== Explicație ==&lt;br /&gt;
Am gasit cuvântul “ea” de 3 ori: o data pe prima linie a tabelului, o data pe diagonala principală, inlocuind &#039;?&#039; cu &#039;a&#039;, şi o data ca “?a&amp;quot; inlocuind &#039;?&#039; cu &#039;e&#039;. Am gasit cuvântul “elena” o data, inlocuind &#039;?&#039; cu &#039;n&#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;gt;&lt;br /&gt;
def is_valid_cell(i, j, n, m):&lt;br /&gt;
    return 0 &amp;lt;= i &amp;lt; n and 0 &amp;lt;= j &amp;lt; m&lt;br /&gt;
&lt;br /&gt;
def search_word(grid, word, n, m, visited, i, j, idx):&lt;br /&gt;
    if idx == len(word):&lt;br /&gt;
        return True&lt;br /&gt;
    if not is_valid_cell(i, j, n, m) or visited[i][j] or grid[i][j] != word[idx]:&lt;br /&gt;
        return False&lt;br /&gt;
    visited[i][j] = True&lt;br /&gt;
    for di in [-1, 0, 1]:&lt;br /&gt;
        for dj in [-1, 0, 1]:&lt;br /&gt;
            if (di, dj) != (0, 0) and search_word(grid, word, n, m, visited, i + di, j + dj, idx + 1):&lt;br /&gt;
                return True&lt;br /&gt;
    visited[i][j] = False&lt;br /&gt;
    return False&lt;br /&gt;
&lt;br /&gt;
def count_word_occurrences(grid, word, n, m):&lt;br /&gt;
    count = 0&lt;br /&gt;
    for i in range(n):&lt;br /&gt;
        for j in range(m):&lt;br /&gt;
            if grid[i][j] == word[0]:&lt;br /&gt;
                visited = [[False] * m for _ in range(n)]&lt;br /&gt;
                if search_word(grid, word, n, m, visited, i, j, 0):&lt;br /&gt;
                    count += 1&lt;br /&gt;
    return count&lt;br /&gt;
&lt;br /&gt;
def main():&lt;br /&gt;
    with open(&amp;quot;cuvinteascunse.in&amp;quot;, &amp;quot;r&amp;quot;) as fin:&lt;br /&gt;
        n, m, c = map(int, fin.readline().split())&lt;br /&gt;
        grid = [fin.readline().split() for _ in range(n)]&lt;br /&gt;
        words = [fin.readline().strip() for _ in range(c)]&lt;br /&gt;
&lt;br /&gt;
    word_counts = {}&lt;br /&gt;
    for word in words:&lt;br /&gt;
        count = count_word_occurrences(grid, word, n, m)&lt;br /&gt;
        if count &amp;gt; 0:&lt;br /&gt;
            word_counts[word] = count&lt;br /&gt;
&lt;br /&gt;
    sorted_words = sorted(word_counts.items(), key=lambda x: x[1], reverse=True)&lt;br /&gt;
&lt;br /&gt;
    with open(&amp;quot;cuvinteascunse.out&amp;quot;, &amp;quot;w&amp;quot;) as fout:&lt;br /&gt;
        fout.write(str(len(sorted_words)) + &amp;quot;\n&amp;quot;)&lt;br /&gt;
        for word, count in sorted_words:&lt;br /&gt;
            fout.write(f&amp;quot;{word} {count}\n&amp;quot;)&lt;br /&gt;
        password = &amp;quot;&amp;quot;&lt;br /&gt;
        for i in range(n):&lt;br /&gt;
            for j in range(m):&lt;br /&gt;
                if grid[i][j] != &amp;quot;?&amp;quot;:&lt;br /&gt;
                    password += chr(ord(&amp;quot;a&amp;quot;) + (count_word_occurrences(grid, grid[i][j], n, m) % 26))&lt;br /&gt;
        fout.write(password + &amp;quot;\n&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
if __name__ == &amp;quot;__main__&amp;quot;:&lt;br /&gt;
    main()&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>RebecaBud</name></author>
	</entry>
	<entry>
		<id>https://wiki.universitas.ro/index.php?title=1829_-_Cuvinte_Ascunse&amp;diff=10024</id>
		<title>1829 - Cuvinte Ascunse</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=1829_-_Cuvinte_Ascunse&amp;diff=10024"/>
		<updated>2024-06-03T17:05:32Z</updated>

		<summary type="html">&lt;p&gt;RebecaBud: /* Enunt */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Enunt ==&lt;br /&gt;
Programatoarea Petra a început un curs de criptografie. Fiind un spirit creativ, Petra a creat deja o metodă elaborată de criptare a unei parole sub forma unei perechi (tabel de litere aparţinând mulţimii {‘a’...’z’}, dicţionar de cuvinte). Din păcate pentru Petra, metoda ei de criptare a parolei, poate fi decriptată de oricine astfel:&lt;br /&gt;
* se iau tabelul de litere şi dicţionarul de cuvinte permise&lt;br /&gt;
* se listează, sortează şi numără toate cuvintele care se găsesc în tabel. Un cuvânt c1c2…ck&lt;br /&gt;
 care există în dicţionar există şi în tabel dacă fiecare literă ci&lt;br /&gt;
 apare în tabel şi pentru i&amp;gt;1, ci&lt;br /&gt;
 este vecină în tabel cu litera ci−1.&lt;br /&gt;
din lista sortata de T perechi (cuvânti, ai), unde cuvântieste un cuvânt iar ai este numărul de apariţii în tabel, reconstituie litera pi a parolei astfel: pi=‘a’ + ( aimod 26). Încercând să îmbunătăţească algoritmul, Petra a decis să înlocuiască unele litere din tabel cu semnul întrebării &#039;?&#039;. Un semn &#039;?&#039; poate fi înlocuit cu orice literă când se parcurge tabelul. Convinge-o pe Petra că, în ciuda îmbunătăţirii, îi poţi găsi parola pornind de la orice pereche de (dicţionar, tabel de litere) dată.&lt;br /&gt;
&lt;br /&gt;
== Cerinţa ==&lt;br /&gt;
Dat fiind un tabel de litere de dimensiuni N x M, şi o listă a cuvintelor din dicţionar, să se afişeze lista sortată de T perechi de forma &#039;ci: ai&#039; şi parola Petrei.&lt;br /&gt;
== Date de intrare ==&lt;br /&gt;
Fişierul cuvinteascunse.in va conţine N + C + 1 linii. Pe prima linie N, M, C – dimensiunile tabelului, şi numărul de cuvinte din dicţionar. Apoi cele N linii ale tabelului:&lt;br /&gt;
t1,1 ...t1,m&lt;br /&gt;
t2,1 ...t2,m&lt;br /&gt;
. . .&lt;br /&gt;
tn,1 ...tn,m&lt;br /&gt;
urmate de cele C cuvinte din dicţionar, fiecare pe o linie:&lt;br /&gt;
cuvânt1&lt;br /&gt;
cuvânt2&lt;br /&gt;
. . .&lt;br /&gt;
cuvântC&lt;br /&gt;
== Date de ieșire ==&lt;br /&gt;
Fişierul cuvinteascunse.out va conţine pe prima linie T, numărul de cuvinte distincte găsite în tabel. Pe următoarele T linii se vor afla perechi cuvânti ai separate printr-un spaţiu. Pe ultima linie se va afla un şir de caractere reprezentand parola Petrei.&lt;br /&gt;
== Restricţii şi precizări ==&lt;br /&gt;
* O secvenţă de litere reprezintă un cuvânt dacă se află în dicţionarul dat ca date de intrare. Dicţionarul conţine cuvinte formate din litere aparţinând mulţimii {‘a’...’z’}U{‘A’...’Z’}. Literele mici şi cele mari se consideră egale. Două litere sunt vecine în tabel, dacă celulele lor au o latura sau un colţ comun. Aceeaşi litera din tabel se poate folosi de mai multe ori într-un cuvânt. Dacă acelaşi semn &#039;?&#039; este folosit de mai multe ori într-un cuvânt, trebuie să reprezinte aceeaşi literă de fiecare dată.&lt;br /&gt;
* 0 &amp;lt; N &amp;lt; 6&lt;br /&gt;
* 0 &amp;lt; M &amp;lt; 6&lt;br /&gt;
* 0 &amp;lt; C &amp;lt; 20000&lt;br /&gt;
== Exemplul 1 ==&lt;br /&gt;
; cuvinteascunse.in&lt;br /&gt;
&lt;br /&gt;
  2 2 3&lt;br /&gt;
  e a&lt;br /&gt;
  l ?&lt;br /&gt;
  ea&lt;br /&gt;
  elena&lt;br /&gt;
  arc&lt;br /&gt;
; cuvinteascunse.out&lt;br /&gt;
&lt;br /&gt;
  2&lt;br /&gt;
  ea 3&lt;br /&gt;
  elena 1&lt;br /&gt;
  db&lt;br /&gt;
== Explicație ==&lt;br /&gt;
Am gasit cuvântul “ea” de 3 ori: o data pe prima linie a tabelului, o data pe diagonala principală, inlocuind &#039;?&#039; cu &#039;a&#039;, şi o data ca “?a&amp;quot; inlocuind &#039;?&#039; cu &#039;e&#039;. Am gasit cuvântul “elena” o data, inlocuind &#039;?&#039; cu &#039;n&#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;gt;&lt;br /&gt;
def is_valid_cell(i, j, n, m):&lt;br /&gt;
    return 0 &amp;lt;= i &amp;lt; n and 0 &amp;lt;= j &amp;lt; m&lt;br /&gt;
&lt;br /&gt;
def search_word(grid, word, n, m, visited, i, j, idx):&lt;br /&gt;
    if idx == len(word):&lt;br /&gt;
        return True&lt;br /&gt;
    if not is_valid_cell(i, j, n, m) or visited[i][j] or grid[i][j] != word[idx]:&lt;br /&gt;
        return False&lt;br /&gt;
    visited[i][j] = True&lt;br /&gt;
    for di in [-1, 0, 1]:&lt;br /&gt;
        for dj in [-1, 0, 1]:&lt;br /&gt;
            if (di, dj) != (0, 0) and search_word(grid, word, n, m, visited, i + di, j + dj, idx + 1):&lt;br /&gt;
                return True&lt;br /&gt;
    visited[i][j] = False&lt;br /&gt;
    return False&lt;br /&gt;
&lt;br /&gt;
def count_word_occurrences(grid, word, n, m):&lt;br /&gt;
    count = 0&lt;br /&gt;
    for i in range(n):&lt;br /&gt;
        for j in range(m):&lt;br /&gt;
            if grid[i][j] == word[0]:&lt;br /&gt;
                visited = [[False] * m for _ in range(n)]&lt;br /&gt;
                if search_word(grid, word, n, m, visited, i, j, 0):&lt;br /&gt;
                    count += 1&lt;br /&gt;
    return count&lt;br /&gt;
&lt;br /&gt;
def main():&lt;br /&gt;
    with open(&amp;quot;cuvinteascunse.in&amp;quot;, &amp;quot;r&amp;quot;) as fin:&lt;br /&gt;
        n, m, c = map(int, fin.readline().split())&lt;br /&gt;
        grid = [fin.readline().split() for _ in range(n)]&lt;br /&gt;
        words = [fin.readline().strip() for _ in range(c)]&lt;br /&gt;
&lt;br /&gt;
    word_counts = {}&lt;br /&gt;
    for word in words:&lt;br /&gt;
        count = count_word_occurrences(grid, word, n, m)&lt;br /&gt;
        if count &amp;gt; 0:&lt;br /&gt;
            word_counts[word] = count&lt;br /&gt;
&lt;br /&gt;
    sorted_words = sorted(word_counts.items(), key=lambda x: x[1], reverse=True)&lt;br /&gt;
&lt;br /&gt;
    with open(&amp;quot;cuvinteascunse.out&amp;quot;, &amp;quot;w&amp;quot;) as fout:&lt;br /&gt;
        fout.write(str(len(sorted_words)) + &amp;quot;\n&amp;quot;)&lt;br /&gt;
        for word, count in sorted_words:&lt;br /&gt;
            fout.write(f&amp;quot;{word} {count}\n&amp;quot;)&lt;br /&gt;
        password = &amp;quot;&amp;quot;&lt;br /&gt;
        for i in range(n):&lt;br /&gt;
            for j in range(m):&lt;br /&gt;
                if grid[i][j] != &amp;quot;?&amp;quot;:&lt;br /&gt;
                    password += chr(ord(&amp;quot;a&amp;quot;) + (count_word_occurrences(grid, grid[i][j], n, m) % 26))&lt;br /&gt;
        fout.write(password + &amp;quot;\n&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
if __name__ == &amp;quot;__main__&amp;quot;:&lt;br /&gt;
    main()&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>RebecaBud</name></author>
	</entry>
	<entry>
		<id>https://wiki.universitas.ro/index.php?title=1829_-_Cuvinte_Ascunse&amp;diff=10023</id>
		<title>1829 - Cuvinte Ascunse</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=1829_-_Cuvinte_Ascunse&amp;diff=10023"/>
		<updated>2024-06-03T17:04:55Z</updated>

		<summary type="html">&lt;p&gt;RebecaBud: Pagină nouă: == Enunt == Programatoarea Petra a început un curs de criptografie. Fiind un spirit creativ, Petra a creat deja o metodă elaborată de criptare a unei parole sub forma unei perechi (tabel de litere aparţinând mulţimii {‘a’...’z’}, dicţionar de cuvinte). Din păcate pentru Petra, metoda ei de criptare a parolei, poate fi decriptată de oricine astfel: * se iau tabelul de litere şi dicţionarul de cuvinte permise * se listează, sortează şi numără toate cuvin...&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Enunt ==&lt;br /&gt;
Programatoarea Petra a început un curs de criptografie. Fiind un spirit creativ, Petra a creat deja o metodă elaborată de criptare a unei parole sub forma unei perechi (tabel de litere aparţinând mulţimii {‘a’...’z’}, dicţionar de cuvinte). Din păcate pentru Petra, metoda ei de criptare a parolei, poate fi decriptată de oricine astfel:&lt;br /&gt;
* se iau tabelul de litere şi dicţionarul de cuvinte permise&lt;br /&gt;
* se listează, sortează şi numără toate cuvintele care se găsesc în tabel. Un cuvânt c1c2…ck&lt;br /&gt;
 care există în dicţionar există şi în tabel dacă fiecare literă ci&lt;br /&gt;
 apare în tabel şi pentru i&amp;gt;1, ci&lt;br /&gt;
 este vecină în tabel cu litera ci−1.&lt;br /&gt;
din lista sortata de T perechi (cuvânti, ai&lt;br /&gt;
), unde cuvânti&lt;br /&gt;
 este un cuvânt iar ai&lt;br /&gt;
 este numărul de apariţii în tabel, reconstituie litera pi&lt;br /&gt;
 a parolei astfel: pi=&lt;br /&gt;
 ‘a’ + ( ai&lt;br /&gt;
  mod 26). Încercând să îmbunătăţească algoritmul, Petra a decis să înlocuiască unele litere din tabel cu semnul întrebării &#039;?&#039;. Un semn &#039;?&#039; poate fi înlocuit cu orice literă când se parcurge tabelul. Convinge-o pe Petra că, în ciuda îmbunătăţirii, îi poţi găsi parola pornind de la orice pereche de (dicţionar, tabel de litere) dată.&lt;br /&gt;
== Cerinţa ==&lt;br /&gt;
Dat fiind un tabel de litere de dimensiuni N x M, şi o listă a cuvintelor din dicţionar, să se afişeze lista sortată de T perechi de forma &#039;ci: ai&#039; şi parola Petrei.&lt;br /&gt;
== Date de intrare ==&lt;br /&gt;
Fişierul cuvinteascunse.in va conţine N + C + 1 linii. Pe prima linie N, M, C – dimensiunile tabelului, şi numărul de cuvinte din dicţionar. Apoi cele N linii ale tabelului:&lt;br /&gt;
t1,1 ...t1,m&lt;br /&gt;
t2,1 ...t2,m&lt;br /&gt;
. . .&lt;br /&gt;
tn,1 ...tn,m&lt;br /&gt;
urmate de cele C cuvinte din dicţionar, fiecare pe o linie:&lt;br /&gt;
cuvânt1&lt;br /&gt;
cuvânt2&lt;br /&gt;
. . .&lt;br /&gt;
cuvântC&lt;br /&gt;
== Date de ieșire ==&lt;br /&gt;
Fişierul cuvinteascunse.out va conţine pe prima linie T, numărul de cuvinte distincte găsite în tabel. Pe următoarele T linii se vor afla perechi cuvânti ai separate printr-un spaţiu. Pe ultima linie se va afla un şir de caractere reprezentand parola Petrei.&lt;br /&gt;
== Restricţii şi precizări ==&lt;br /&gt;
* O secvenţă de litere reprezintă un cuvânt dacă se află în dicţionarul dat ca date de intrare. Dicţionarul conţine cuvinte formate din litere aparţinând mulţimii {‘a’...’z’}U{‘A’...’Z’}. Literele mici şi cele mari se consideră egale. Două litere sunt vecine în tabel, dacă celulele lor au o latura sau un colţ comun. Aceeaşi litera din tabel se poate folosi de mai multe ori într-un cuvânt. Dacă acelaşi semn &#039;?&#039; este folosit de mai multe ori într-un cuvânt, trebuie să reprezinte aceeaşi literă de fiecare dată.&lt;br /&gt;
* 0 &amp;lt; N &amp;lt; 6&lt;br /&gt;
* 0 &amp;lt; M &amp;lt; 6&lt;br /&gt;
* 0 &amp;lt; C &amp;lt; 20000&lt;br /&gt;
== Exemplul 1 ==&lt;br /&gt;
; cuvinteascunse.in&lt;br /&gt;
&lt;br /&gt;
  2 2 3&lt;br /&gt;
  e a&lt;br /&gt;
  l ?&lt;br /&gt;
  ea&lt;br /&gt;
  elena&lt;br /&gt;
  arc&lt;br /&gt;
; cuvinteascunse.out&lt;br /&gt;
&lt;br /&gt;
  2&lt;br /&gt;
  ea 3&lt;br /&gt;
  elena 1&lt;br /&gt;
  db&lt;br /&gt;
== Explicație ==&lt;br /&gt;
Am gasit cuvântul “ea” de 3 ori: o data pe prima linie a tabelului, o data pe diagonala principală, inlocuind &#039;?&#039; cu &#039;a&#039;, şi o data ca “?a&amp;quot; inlocuind &#039;?&#039; cu &#039;e&#039;. Am gasit cuvântul “elena” o data, inlocuind &#039;?&#039; cu &#039;n&#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;gt;&lt;br /&gt;
def is_valid_cell(i, j, n, m):&lt;br /&gt;
    return 0 &amp;lt;= i &amp;lt; n and 0 &amp;lt;= j &amp;lt; m&lt;br /&gt;
&lt;br /&gt;
def search_word(grid, word, n, m, visited, i, j, idx):&lt;br /&gt;
    if idx == len(word):&lt;br /&gt;
        return True&lt;br /&gt;
    if not is_valid_cell(i, j, n, m) or visited[i][j] or grid[i][j] != word[idx]:&lt;br /&gt;
        return False&lt;br /&gt;
    visited[i][j] = True&lt;br /&gt;
    for di in [-1, 0, 1]:&lt;br /&gt;
        for dj in [-1, 0, 1]:&lt;br /&gt;
            if (di, dj) != (0, 0) and search_word(grid, word, n, m, visited, i + di, j + dj, idx + 1):&lt;br /&gt;
                return True&lt;br /&gt;
    visited[i][j] = False&lt;br /&gt;
    return False&lt;br /&gt;
&lt;br /&gt;
def count_word_occurrences(grid, word, n, m):&lt;br /&gt;
    count = 0&lt;br /&gt;
    for i in range(n):&lt;br /&gt;
        for j in range(m):&lt;br /&gt;
            if grid[i][j] == word[0]:&lt;br /&gt;
                visited = [[False] * m for _ in range(n)]&lt;br /&gt;
                if search_word(grid, word, n, m, visited, i, j, 0):&lt;br /&gt;
                    count += 1&lt;br /&gt;
    return count&lt;br /&gt;
&lt;br /&gt;
def main():&lt;br /&gt;
    with open(&amp;quot;cuvinteascunse.in&amp;quot;, &amp;quot;r&amp;quot;) as fin:&lt;br /&gt;
        n, m, c = map(int, fin.readline().split())&lt;br /&gt;
        grid = [fin.readline().split() for _ in range(n)]&lt;br /&gt;
        words = [fin.readline().strip() for _ in range(c)]&lt;br /&gt;
&lt;br /&gt;
    word_counts = {}&lt;br /&gt;
    for word in words:&lt;br /&gt;
        count = count_word_occurrences(grid, word, n, m)&lt;br /&gt;
        if count &amp;gt; 0:&lt;br /&gt;
            word_counts[word] = count&lt;br /&gt;
&lt;br /&gt;
    sorted_words = sorted(word_counts.items(), key=lambda x: x[1], reverse=True)&lt;br /&gt;
&lt;br /&gt;
    with open(&amp;quot;cuvinteascunse.out&amp;quot;, &amp;quot;w&amp;quot;) as fout:&lt;br /&gt;
        fout.write(str(len(sorted_words)) + &amp;quot;\n&amp;quot;)&lt;br /&gt;
        for word, count in sorted_words:&lt;br /&gt;
            fout.write(f&amp;quot;{word} {count}\n&amp;quot;)&lt;br /&gt;
        password = &amp;quot;&amp;quot;&lt;br /&gt;
        for i in range(n):&lt;br /&gt;
            for j in range(m):&lt;br /&gt;
                if grid[i][j] != &amp;quot;?&amp;quot;:&lt;br /&gt;
                    password += chr(ord(&amp;quot;a&amp;quot;) + (count_word_occurrences(grid, grid[i][j], n, m) % 26))&lt;br /&gt;
        fout.write(password + &amp;quot;\n&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
if __name__ == &amp;quot;__main__&amp;quot;:&lt;br /&gt;
    main()&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>RebecaBud</name></author>
	</entry>
	<entry>
		<id>https://wiki.universitas.ro/index.php?title=0711_-_Desc&amp;diff=10020</id>
		<title>0711 - Desc</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=0711_-_Desc&amp;diff=10020"/>
		<updated>2024-06-03T17:00:44Z</updated>

		<summary type="html">&lt;p&gt;RebecaBud: Pagină nouă: == Enunt == Fie n un număr natural nenul, n &amp;gt; 1. Definim n(p) ca fiind descompunerea lui n în sumă de puteri naturale distincte ale numărului prim p.  Exemple:  * pentru n=10 toate n(p) descompunerile posibile sunt: 10(2)=21+23 şi 10(3)=30+32 * pentru n=11 toate n(p) descompunerile posibile sunt: 11(2)=20+21+23 şi 11(11)=111 == Cerinţa == Să se scrie un program care citeşte un număr natural n şi determină toate n(p) descompunerile numărului n. == Date de intrare...&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Enunt ==&lt;br /&gt;
Fie n un număr natural nenul, n &amp;gt; 1. Definim n(p) ca fiind descompunerea lui n în sumă de puteri naturale distincte ale numărului prim p.&lt;br /&gt;
&lt;br /&gt;
Exemple:&lt;br /&gt;
&lt;br /&gt;
* pentru n=10 toate n(p) descompunerile posibile sunt: 10(2)=21+23 şi 10(3)=30+32&lt;br /&gt;
* pentru n=11 toate n(p) descompunerile posibile sunt: 11(2)=20+21+23 şi 11(11)=111&lt;br /&gt;
== Cerinţa ==&lt;br /&gt;
Să se scrie un program care citeşte un număr natural n şi determină toate n(p) descompunerile numărului n.&lt;br /&gt;
== Date de intrare ==&lt;br /&gt;
Fișierul de intrare desc.in conține pe prima linie numărul n.&lt;br /&gt;
== Date de ieșire ==&lt;br /&gt;
Fișierul de ieșire desc.out va conține pe linii separate toate n(p) descompunerile numărului n. Fiecare linie va conţine în ordine:&lt;br /&gt;
* o valoare naturală p reprezentând numărul prim asociat descompunerii;&lt;br /&gt;
* o valoare naturală k, reprezentând numărul de termeni ai descompunerii;&lt;br /&gt;
* Următoarele k valori, numere naturale, reprezintă exponenţii puterilor din descompunere, scrise în ordine crescătoare.&lt;br /&gt;
== Restricţii şi precizări ==&lt;br /&gt;
* &#039;&#039;&#039;2 ≤ n ≤ 10 000 000&#039;&#039;&#039;&lt;br /&gt;
* Pentru un număr prim p fixat, există o singură n(p) descompunere a unui număr natural n;&lt;br /&gt;
* Descompunerile vor fi afişate în ordinea crescătoare a valorilor identificate pentru p;&lt;br /&gt;
* Pe fiecare linie a fişierului de ieşire, valorile vor fi despărţite prin câte un spaţiu.&lt;br /&gt;
== Exemplul 1 ==&lt;br /&gt;
; desc.in&lt;br /&gt;
&lt;br /&gt;
  10&lt;br /&gt;
; desc.out&lt;br /&gt;
&lt;br /&gt;
  2 2 1 3&lt;br /&gt;
  3 2 0 2&lt;br /&gt;
== Explicație ==&lt;br /&gt;
10(2)=21+23; 10(3)=30+32. Prima descompunere s-a făcut după numărul prim p=2 şi conţine 2 termeni cu puterile 1 şi 3. A doua descompunere s-a făcut după numărul prim p=3 şi conţine 2 termeni cu puterile 0 şi 2.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Exemplul 2 ==&lt;br /&gt;
; desc.in&lt;br /&gt;
&lt;br /&gt;
  11&lt;br /&gt;
; desc.out&lt;br /&gt;
&lt;br /&gt;
  2 3 0 1 3 &lt;br /&gt;
  11 1 1 &lt;br /&gt;
== Explicație ==&lt;br /&gt;
11(2)=20+21+23; 11(11)=111. Prima descompunere s-a făcut după numărul prim p=2 şi conţine 3 termeni cu puterile 0, 1 şi 3. A doua descompunere s-a făcut după numărul prim p=11 şi conţine un termen cu puterea 1.&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;gt;&lt;br /&gt;
def prime_factors(n):&lt;br /&gt;
    factors = []&lt;br /&gt;
    d = 2&lt;br /&gt;
    while d * d &amp;lt;= n:&lt;br /&gt;
        while n % d == 0:&lt;br /&gt;
            factors.append(d)&lt;br /&gt;
            n //= d&lt;br /&gt;
        d += 1&lt;br /&gt;
    if n &amp;gt; 1:&lt;br /&gt;
        factors.append(n)&lt;br /&gt;
    return factors&lt;br /&gt;
&lt;br /&gt;
def decompose(n):&lt;br /&gt;
    primes = prime_factors(n)&lt;br /&gt;
    decompositions = []&lt;br /&gt;
    for p in set(primes):&lt;br /&gt;
        exponents = []&lt;br /&gt;
        count = primes.count(p)&lt;br /&gt;
        for i in range(count):&lt;br /&gt;
            exponents.append(i)&lt;br /&gt;
        decompositions.append((p, count, exponents))&lt;br /&gt;
    return sorted(decompositions)&lt;br /&gt;
&lt;br /&gt;
def main():&lt;br /&gt;
    with open(&amp;quot;desc.in&amp;quot;, &amp;quot;r&amp;quot;) as fin:&lt;br /&gt;
        n = int(fin.readline())&lt;br /&gt;
&lt;br /&gt;
    decompositions = decompose(n)&lt;br /&gt;
&lt;br /&gt;
    with open(&amp;quot;desc.out&amp;quot;, &amp;quot;w&amp;quot;) as fout:&lt;br /&gt;
        for decomposition in decompositions:&lt;br /&gt;
            p, k, exponents = decomposition&lt;br /&gt;
            fout.write(f&amp;quot;{p} {k} {&#039; &#039;.join(map(str, exponents))}\n&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
if __name__ == &amp;quot;__main__&amp;quot;:&lt;br /&gt;
    main()&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>RebecaBud</name></author>
	</entry>
	<entry>
		<id>https://wiki.universitas.ro/index.php?title=1022_-_Fractii_2&amp;diff=10018</id>
		<title>1022 - Fractii 2</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=1022_-_Fractii_2&amp;diff=10018"/>
		<updated>2024-06-03T16:57:49Z</updated>

		<summary type="html">&lt;p&gt;RebecaBud: Pagină nouă: == Enunt == Numărul 1 poate fi scris în diverse moduri ca sumă de fracţii cu numărătorul 1 şi numitorul o putere a lui 2. De exemplu:  &amp;#039;&amp;#039;&amp;#039;1 = 1/2 + 1/2 = 1/2 + 1/4 + 1/8 + 1/8 = 1/8 + 1/4 + 1/2 + 1/8&amp;#039;&amp;#039;&amp;#039;  Două scrieri nu sunt considerate distincte dacă folosesc aceleaşi fracţii scrise în altă ordine. În exemplul de mai sus ultimele două scrieri nu sunt distincte. == Cerinţa == Pentru N – număr natural nenul să se determine: a) O modalitate de scriere a num...&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Enunt ==&lt;br /&gt;
Numărul 1 poate fi scris în diverse moduri ca sumă de fracţii cu numărătorul 1 şi numitorul o putere a lui 2. De exemplu:&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;1 = 1/2 + 1/2 = 1/2 + 1/4 + 1/8 + 1/8 = 1/8 + 1/4 + 1/2 + 1/8&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Două scrieri nu sunt considerate distincte dacă folosesc aceleaşi fracţii scrise în altă ordine. În exemplul de mai sus ultimele două scrieri nu sunt distincte.&lt;br /&gt;
== Cerinţa ==&lt;br /&gt;
Pentru N – număr natural nenul să se determine:&lt;br /&gt;
a) O modalitate de scriere a numărului 1 ca sumă de exact N fracţii cu numărătorul 1 şi numitorul o putere a lui 2.&lt;br /&gt;
b) Numărul de scrieri distincte a numărului 1 ca sumă de exact N fracţii cu numărătorul 1 şi numitorul o putere a lui 2. Deoarece acest număr poate fi foarte mare acest număr trebuie calculat modulo 100003.&lt;br /&gt;
== Date de intrare ==&lt;br /&gt;
Fişierul de intrare fractii2.in conţine pe prima linie un număr natural p. Pentru toate testele de intrare, numărul p poate avea doar valoarea 1 sau valoarea 2.&lt;br /&gt;
Pe a doua linie se găseşte un singur număr N natural – reprezentând numărul de fracţii&lt;br /&gt;
== Date de ieșire ==&lt;br /&gt;
Dacă valoarea lui p este 1, se va rezolva numai punctul a) din cerinţă. În acest caz, în fişierul de ieşire fractii2.out se vor scrie, pe o singură linie, N numere naturale separate prin câte un spaţiu reprezentând cei N exponenţi ai lui 2 din scrierea solicitată în prima cerinţă. Astfel, dacă numerele afişate sunt m1,m2,…,mn&lt;br /&gt;
 atunci există scrierea 1=12m1+12m2+…+12mn&lt;br /&gt;
 .&lt;br /&gt;
Dacă valoarea lui p este 2, se va rezolva numai punctul b) din cerinţă. În acest caz, în fişierul de ieşire fractii2.out se va scrie un număr natural reprezentând răspunsul la a doua cerinţă, adică numărul de scrieri distincte a numărului 1 ca sumă de N fracţii cu numărătorul 1 şi numitorul o putere a lui 2 (modulo 100003).&lt;br /&gt;
&lt;br /&gt;
Restricţii&lt;br /&gt;
== Restricţii şi precizări ==&lt;br /&gt;
* &#039;&#039;&#039;2 ≤ N ≤ 2000&#039;&#039;&#039;&lt;br /&gt;
* Pentru prima cerinţă se acordă 20% din punctaj.&lt;br /&gt;
* Pentru a doua cerinţă de acordă 80% din punctaj.&lt;br /&gt;
* Rezultatul pentru a doua cerinţă trebuie afişat modulo 100003&lt;br /&gt;
== Exemplul 1 ==&lt;br /&gt;
; fractii2.in&lt;br /&gt;
 &lt;br /&gt;
 1&lt;br /&gt;
 4&lt;br /&gt;
; fractii2.out&lt;br /&gt;
&lt;br /&gt;
  2 2 2 2&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Exemplul 2 ==&lt;br /&gt;
; fractii2.in&lt;br /&gt;
&lt;br /&gt;
  2 &lt;br /&gt;
  4&lt;br /&gt;
; fractii2.out&lt;br /&gt;
&lt;br /&gt;
 2&lt;br /&gt;
== Explicaţie ==&lt;br /&gt;
Primul exemplu:&lt;br /&gt;
&lt;br /&gt;
1 = 1/2 + 1/4 + 1/8 + 1/8 = 1/4 + 1/4 + 1/4 + 1/4&lt;br /&gt;
Răspunsul corespunde celei de-a doua scrieri dar există şi alte variante corecte de răspuns. De exemplu, 3 1 2 3 se consideră răspuns corect.&lt;br /&gt;
Atenţie! Pentru acest test se va afişa doar rezultatul la cerinţa a).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Al doilea exemplu:&lt;br /&gt;
&lt;br /&gt;
1 = 1/2 + 1/4 + 1/8 + 1/8 = 1/4 + 1/4 + 1/4 + 1/4&lt;br /&gt;
&lt;br /&gt;
Acestea sunt singurele scrieri distincte.&lt;br /&gt;
Atenţie! Pentru acest test se va afişa doar rezultatul la cerinţa b).&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;gt;&lt;br /&gt;
def write_fractions(N):&lt;br /&gt;
    exponents = [1] * N&lt;br /&gt;
    return exponents&lt;br /&gt;
&lt;br /&gt;
def count_distinct_writings(N):&lt;br /&gt;
    MOD = 100003&lt;br /&gt;
    if N == 2:&lt;br /&gt;
        return 1&lt;br /&gt;
&lt;br /&gt;
    dp = [0] * (N + 1)&lt;br /&gt;
    dp[0] = 1&lt;br /&gt;
    for i in range(1, N):&lt;br /&gt;
        for j in range(i, N + 1):&lt;br /&gt;
            dp[j] = (dp[j] + dp[j - i]) % MOD&lt;br /&gt;
&lt;br /&gt;
    return dp[N]&lt;br /&gt;
&lt;br /&gt;
def main():&lt;br /&gt;
    with open(&amp;quot;fractii2.in&amp;quot;, &amp;quot;r&amp;quot;) as fin:&lt;br /&gt;
        p = int(fin.readline())&lt;br /&gt;
        N = int(fin.readline())&lt;br /&gt;
&lt;br /&gt;
    if p == 1:&lt;br /&gt;
        with open(&amp;quot;fractii2.out&amp;quot;, &amp;quot;w&amp;quot;) as fout:&lt;br /&gt;
            exponents = write_fractions(N)&lt;br /&gt;
            fout.write(&amp;quot; &amp;quot;.join(map(str, exponents)))&lt;br /&gt;
    elif p == 2:&lt;br /&gt;
        with open(&amp;quot;fractii2.out&amp;quot;, &amp;quot;w&amp;quot;) as fout:&lt;br /&gt;
            distinct_writings = count_distinct_writings(N)&lt;br /&gt;
            fout.write(str(distinct_writings % 100003))&lt;br /&gt;
&lt;br /&gt;
if __name__ == &amp;quot;__main__&amp;quot;:&lt;br /&gt;
    main()&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>RebecaBud</name></author>
	</entry>
	<entry>
		<id>https://wiki.universitas.ro/index.php?title=1203_-_K_Secv&amp;diff=10016</id>
		<title>1203 - K Secv</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=1203_-_K_Secv&amp;diff=10016"/>
		<updated>2024-06-03T16:54:50Z</updated>

		<summary type="html">&lt;p&gt;RebecaBud: Pagină nouă: == Enunt ==   Fie un vector V cu N elemente și un număr K. Vectorul V trebuie împărțit în exact K subsecvențe nevide, astfel încât fiecare element din vector să aparțină exact unei subsecvențe. Această împărțire trebuie făcută astfel încât maximul șmecheriei fiecărei subsecvențe să fie cât mai mic. (Această problemă concepe greșit sistemul de șmecherie și valoare). Șmecheria fiecărei subsecvențe se definește ca fiind parte întreagă din ((V...&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Enunt ==  &lt;br /&gt;
Fie un vector V cu N elemente și un număr K. Vectorul V trebuie împărțit în exact K subsecvențe nevide, astfel încât fiecare element din vector să aparțină exact unei subsecvențe. Această împărțire trebuie făcută astfel încât maximul șmecheriei fiecărei subsecvențe să fie cât mai mic. (Această problemă concepe greșit sistemul de șmecherie și valoare). Șmecheria fiecărei subsecvențe se definește ca fiind parte întreagă din ((Vmax – Vmin + 1) / 2), unde Vmax este valoarea maximă din subsecvență, iar Vmin este valoarea minimă.&lt;br /&gt;
&lt;br /&gt;
Vectorul V de N elemente va fi generat în felul următor: se dă un număr M și 2 vectori A și B de lungime M (indexați de la 0 la M - 1). Fiecare element i, 0 ≤ i &amp;lt; N, din vectorul V va fi calculat cu următoarea formulă: V[i] = (A[i % M] ^ B[i / M]), unde x % y reprezintă restul lui x la împărțirea cu y, x / y reprezintă câtul împărțirii lui x la y și x ^ y reprezintă rezultatul operației xor (sau exclusiv pe biți) dintre x și y. &lt;br /&gt;
&lt;br /&gt;
== Date de intrare ==&lt;br /&gt;
Pe prima linie a fișierului ksecv.in se află 3 numere naturale N, K și M, cu semnificația din enunț, separate prin câte un spațiu. Pe a doua linie a fișierului se află M numere naturale separate prin câte un spațiu, reprezentând vectorul A. Pe a treia linie se află M numere naturale separate prin câte un spațiu, reprezentând vectorul B.&lt;br /&gt;
== Date de ieșire ==&lt;br /&gt;
Pe prima linie a fișierului de ieșire ksecv.out se va afișa cel mai mic număr natural S pentru care vectorul V poate fi împărțit în exact K subsecvențe nevide, fiecare având șmecheria mai mică sau egală cu S.&lt;br /&gt;
== Restricţii şi precizări ==&lt;br /&gt;
* 1 ≤ N ≤ 1 000 000&lt;br /&gt;
* 1 ≤ K ≤ 1 000&lt;br /&gt;
* 1 ≤ M ≤ 2 048&lt;br /&gt;
* N &amp;lt; M*M&lt;br /&gt;
* 1 ≤ K &amp;lt; N&lt;br /&gt;
* Valorile vectorilor A și B vor fi din intervalul [0, 260 - 1]&lt;br /&gt;
* Fiecare din cele K subsecvențe trebuie să aibă cel puțin un element.&lt;br /&gt;
* Pentru 20% din teste N ≤ 100, K ≤ 50.&lt;br /&gt;
* Pentru alte 20% din teste N ≤ 100 000, K ≤ 1000.&lt;br /&gt;
* Pentru alte 20% din teste N ≤ 1 000 000, K ≤ 50.&lt;br /&gt;
* Vectorul V are indicii indexați de la 0 la N - 1.&lt;br /&gt;
* Vectorii A și B au indicii indexați de la 0 la M - 1.&lt;br /&gt;
== Exemplul 1 ==&lt;br /&gt;
; ksecv.in&lt;br /&gt;
&lt;br /&gt;
  6 3 6&lt;br /&gt;
  13 4 6 19 4 10&lt;br /&gt;
  0 0 0 0 0 0&lt;br /&gt;
; ksecv.out&lt;br /&gt;
&lt;br /&gt;
  5&lt;br /&gt;
== Explicație ==&lt;br /&gt;
Valorile vectorului V sunt 13 4 6 19 4 10.&lt;br /&gt;
&lt;br /&gt;
Dacă împărțim șirul în subsecvențele [0,2] [3,3] [4,5] obținem șmecheriile 5, 0 și 3. Șmecheria maxima este 5.&lt;br /&gt;
&lt;br /&gt;
Nu putem împărți vectorul V astfel încât șmecheria maximă a unei subsecvențe să fie mai mică decât 5.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Exemplul 2 ==&lt;br /&gt;
; ksecv.in&lt;br /&gt;
&lt;br /&gt;
  6 4 6&lt;br /&gt;
  13 4 6 19 4 10&lt;br /&gt;
  0 0 0 0 0 0&lt;br /&gt;
; ksecv.out&lt;br /&gt;
&lt;br /&gt;
 3&lt;br /&gt;
== Explicație ==&lt;br /&gt;
Valorile vectorului V sunt 13 4 6 19 4 10.&lt;br /&gt;
O posibilă împărțire este: [0,0] [1,2] [3,3] [4,5]. Șmecheriile fiecărei subsecvențe sunt 0, 1, 0 și 3.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Exemplul 3 ==&lt;br /&gt;
; ksecv.in&lt;br /&gt;
&lt;br /&gt;
  6 3 3&lt;br /&gt;
  3 4 2&lt;br /&gt;
  4 5 3&lt;br /&gt;
; ksecv.out&lt;br /&gt;
&lt;br /&gt;
  3&lt;br /&gt;
== Explicație ==&lt;br /&gt;
Valorile vectorului V sunt 7 0 6 6 1 7.&lt;br /&gt;
&lt;br /&gt;
Dacă împărțim în subsecvențele [0,0] [1,4] [5,5], obținem șmecheriile 0, 3 și 0.&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;gt;&lt;br /&gt;
def calculate_smek(X):&lt;br /&gt;
    return (max(X) - min(X) + 1) // 2&lt;br /&gt;
&lt;br /&gt;
def check_feasibility(N, K, M, A, B, S):&lt;br /&gt;
    count = 1&lt;br /&gt;
    min_smek = max_smek = calculate_smek([A[i % M] ^ B[i // M] for i in range(N)])&lt;br /&gt;
&lt;br /&gt;
    for i in range(1, N):&lt;br /&gt;
        max_smek = max(max_smek, calculate_smek([A[i % M] ^ B[i // M] for i in range(N - i)]))&lt;br /&gt;
        if max_smek &amp;lt;= S:&lt;br /&gt;
            count += 1&lt;br /&gt;
&lt;br /&gt;
    return count &amp;gt;= K&lt;br /&gt;
&lt;br /&gt;
def binary_search(N, K, M, A, B):&lt;br /&gt;
    left = 0&lt;br /&gt;
    right = calculate_smek([A[i % M] ^ B[i // M] for i in range(N)])&lt;br /&gt;
&lt;br /&gt;
    while left &amp;lt; right:&lt;br /&gt;
        mid = (left + right) // 2&lt;br /&gt;
        if check_feasibility(N, K, M, A, B, mid):&lt;br /&gt;
            right = mid&lt;br /&gt;
        else:&lt;br /&gt;
            left = mid + 1&lt;br /&gt;
&lt;br /&gt;
    return left&lt;br /&gt;
&lt;br /&gt;
def main():&lt;br /&gt;
    with open(&amp;quot;ksecv.in&amp;quot;, &amp;quot;r&amp;quot;) as fin:&lt;br /&gt;
        N, K, M = map(int, fin.readline().split())&lt;br /&gt;
        A = list(map(int, fin.readline().split()))&lt;br /&gt;
        B = list(map(int, fin.readline().split()))&lt;br /&gt;
&lt;br /&gt;
    with open(&amp;quot;ksecv.out&amp;quot;, &amp;quot;w&amp;quot;) as fout:&lt;br /&gt;
        fout.write(str(binary_search(N, K, M, A, B)))&lt;br /&gt;
&lt;br /&gt;
if __name__ == &amp;quot;__main__&amp;quot;:&lt;br /&gt;
    main()&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>RebecaBud</name></author>
	</entry>
	<entry>
		<id>https://wiki.universitas.ro/index.php?title=0694_-_Sam&amp;diff=10015</id>
		<title>0694 - Sam</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=0694_-_Sam&amp;diff=10015"/>
		<updated>2024-06-03T16:51:08Z</updated>

		<summary type="html">&lt;p&gt;RebecaBud: Pagină nouă: == Enunt ==  Aranjăm primele N numere naturale nenule sub forma unui șir A[1], A[2], ..., A[N].  Fie X[1], X[2],...,X[K] (K ≥ 3), un subșir al șirului A. Numim extrem local al subșirului X termenul din mijlocul unei secvențe de lungime trei din subșir, X[i-1], X[i], X[i+1], cu proprietatea: X[i-1]&amp;lt;X[i]&amp;gt;X[i+1], 1&amp;lt;i&amp;lt;K sau X[i-1]&amp;gt;X[i]&amp;lt;X[i+1], 1&amp;lt;i&amp;lt;K.  Vom nota cu nrex(X) numărul de extreme locale ale subșirului X.  Spunem că un subșir X[1], X[2],...,X[K] (K≥2) al...&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Enunt ==&lt;br /&gt;
&lt;br /&gt;
Aranjăm primele N numere naturale nenule sub forma unui șir A[1], A[2], ..., A[N].&lt;br /&gt;
&lt;br /&gt;
Fie X[1], X[2],...,X[K] (K ≥ 3), un subșir al șirului A. Numim extrem local al subșirului X termenul din mijlocul unei secvențe de lungime trei din subșir, X[i-1], X[i], X[i+1], cu proprietatea: X[i-1]&amp;lt;X[i]&amp;gt;X[i+1], 1&amp;lt;i&amp;lt;K sau X[i-1]&amp;gt;X[i]&amp;lt;X[i+1], 1&amp;lt;i&amp;lt;K.&lt;br /&gt;
&lt;br /&gt;
Vom nota cu nrex(X) numărul de extreme locale ale subșirului X.&lt;br /&gt;
&lt;br /&gt;
Spunem că un subșir X[1], X[2],...,X[K] (K≥2) al șirului A este subșir alternant dacă nrex(X)=K-2, adică exceptând primul și ultimul termen din subșir toți ceilalți termeni sunt extreme locale ale subșirului X.&lt;br /&gt;
&lt;br /&gt;
Dintre toate subșirurile alternante ale șirului A ne interesează cele de lungime maximă pe care le vom numi subșiruri alternante maximale.&lt;br /&gt;
== Cerinţa ==&lt;br /&gt;
Cunoscând N și tabloul A se cere să se determine restul obținut la împărțirea dintre numărul M al subșirurilor alternante maximale ale tabloului A și numărul 1000003.&lt;br /&gt;
== Date de intrare ==&lt;br /&gt;
Fișierul de intrare sam.in conţine pe prima linie numărul natural N. Pe linia a doua se găsesc cele N numere ale șirului dat separate prin câte un spațiu.&lt;br /&gt;
== Date de ieșire ==&lt;br /&gt;
În fişierul de ieşire sam.out se va scrie numărul obţinut ca rest la împărţirea dintre numărul M, având semnificația descrisă mai sus, şi numărul 1000003.&lt;br /&gt;
== Restricţii şi precizări ==&lt;br /&gt;
* &#039;&#039;&#039;3 ≤ N ≤ 100 000&#039;&#039;&#039; &lt;br /&gt;
== Exemplul 1 ==&lt;br /&gt;
; sam.in&lt;br /&gt;
&lt;br /&gt;
  7&lt;br /&gt;
  1 3 5 4 7 6 2&lt;br /&gt;
; sam.out&lt;br /&gt;
&lt;br /&gt;
 6&lt;br /&gt;
== Explicație ==&lt;br /&gt;
Șirul dat conține trei extreme locale , valorile 5, 4 și 7. Cele șase subșiruri alternante maximale cu șirul dat sunt: (1 5 4 6 2), (1 5 4 7 2), (1 5 4 7 6), (3 5 4 6 2), (3 5 4 7 2), (3 5 4 7 6)&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&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;gt;&lt;br /&gt;
def count_alternating_subsequences(N, A):&lt;br /&gt;
    count = 0&lt;br /&gt;
    &lt;br /&gt;
    for i in range(1, N - 1):&lt;br /&gt;
        if (A[i - 1] &amp;lt; A[i] &amp;gt; A[i + 1]) or (A[i - 1] &amp;gt; A[i] &amp;lt; A[i + 1]):&lt;br /&gt;
            count += 1&lt;br /&gt;
    &lt;br /&gt;
    return count&lt;br /&gt;
&lt;br /&gt;
def main():&lt;br /&gt;
    with open(&amp;quot;sam.in&amp;quot;, &amp;quot;r&amp;quot;) as fin:&lt;br /&gt;
        N = int(fin.readline())&lt;br /&gt;
        A = list(map(int, fin.readline().split()))&lt;br /&gt;
    &lt;br /&gt;
    M = count_alternating_subsequences(N, A)&lt;br /&gt;
    &lt;br /&gt;
    with open(&amp;quot;sam.out&amp;quot;, &amp;quot;w&amp;quot;) as fout:&lt;br /&gt;
        fout.write(str(M % 1000003))&lt;br /&gt;
&lt;br /&gt;
if __name__ == &amp;quot;__main__&amp;quot;:&lt;br /&gt;
    main()&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>RebecaBud</name></author>
	</entry>
	<entry>
		<id>https://wiki.universitas.ro/index.php?title=3649_-_CMMDC_4&amp;diff=10012</id>
		<title>3649 - CMMDC 4</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=3649_-_CMMDC_4&amp;diff=10012"/>
		<updated>2024-06-03T16:45:20Z</updated>

		<summary type="html">&lt;p&gt;RebecaBud: /* Rezolvare */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Enunt ==&lt;br /&gt;
== Cerinţa ==&lt;br /&gt;
Dându-se N, determinați valoarea expresiei: a1•b1•c1 + a2•b2•c2 + ... + ak•bk•ck&lt;br /&gt;
unde (a1,b1,c1), (a2,b2,c2), …, (ak,bk,ck) sunt toate tripletele care îndeplinesc condițiile de mai sus. Întrucât rezultatul poate fi foarte mare, afișați resul împărțirii valorii expresiei la numărul 1.000.000.007.&lt;br /&gt;
== Date de intrare ==&lt;br /&gt;
De la tastatură se citește numărul N.&lt;br /&gt;
== Date de ieșire ==&lt;br /&gt;
Pe ecran se va afișa un singur număr natural R reprezentând restul împărțirii rezultatului expresiei descrise anterior la numărul 1.000.000.007.&lt;br /&gt;
== Restricţii şi precizări ==&lt;br /&gt;
* &#039;&#039;&#039;1 ≤ n ≤ 1.000.000&#039;&#039;&#039;&lt;br /&gt;
== Exemplul 1 ==&lt;br /&gt;
; Intrare&lt;br /&gt;
&lt;br /&gt;
  4&lt;br /&gt;
; Ieșire&lt;br /&gt;
&lt;br /&gt;
  36&lt;br /&gt;
== Explicație ==&lt;br /&gt;
Tripletele valide sunt: (2, 3, 1), (3, 4, 1), (3, 2, 1), (4, 3, 1).&lt;br /&gt;
2*3*1 + 3*4*1 +3*2*1 + 4*3*1 = 36. Restul împărțirii numărului 36 la 1.000.000.007 este 36.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&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;gt;&lt;br /&gt;
def gcd(a, b):&lt;br /&gt;
    while b:&lt;br /&gt;
        a, b = b, a % b&lt;br /&gt;
    return a&lt;br /&gt;
&lt;br /&gt;
def euler_totient(N):&lt;br /&gt;
    phi = [i for i in range(N + 1)]&lt;br /&gt;
    for i in range(2, N + 1):&lt;br /&gt;
        if phi[i] == i:  # i este prim&lt;br /&gt;
            for j in range(i, N + 1, i):&lt;br /&gt;
                phi[j] -= phi[j] // i&lt;br /&gt;
    return phi&lt;br /&gt;
&lt;br /&gt;
def main():&lt;br /&gt;
    N = int(input(&amp;quot;Introduceți valoarea lui N: &amp;quot;))&lt;br /&gt;
&lt;br /&gt;
    totient = euler_totient(N)&lt;br /&gt;
&lt;br /&gt;
    result = 0&lt;br /&gt;
    mod = 10**9 + 7&lt;br /&gt;
&lt;br /&gt;
    for p in range(2, N + 1):&lt;br /&gt;
        for k in range(1, N // p + 1):&lt;br /&gt;
            a = p * k&lt;br /&gt;
            b = p * k + 1&lt;br /&gt;
            if b &amp;gt; N:&lt;br /&gt;
                break&lt;br /&gt;
            c = p&lt;br /&gt;
            result += a * b * c * totient[p] % mod&lt;br /&gt;
            result %= mod&lt;br /&gt;
&lt;br /&gt;
    print(result)&lt;br /&gt;
&lt;br /&gt;
if __name__ == &amp;quot;__main__&amp;quot;:&lt;br /&gt;
    main()&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>RebecaBud</name></author>
	</entry>
	<entry>
		<id>https://wiki.universitas.ro/index.php?title=3649_-_CMMDC_4&amp;diff=10011</id>
		<title>3649 - CMMDC 4</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=3649_-_CMMDC_4&amp;diff=10011"/>
		<updated>2024-06-03T16:44:43Z</updated>

		<summary type="html">&lt;p&gt;RebecaBud: /* Rezolvare */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Enunt ==&lt;br /&gt;
== Cerinţa ==&lt;br /&gt;
Dându-se N, determinați valoarea expresiei: a1•b1•c1 + a2•b2•c2 + ... + ak•bk•ck&lt;br /&gt;
unde (a1,b1,c1), (a2,b2,c2), …, (ak,bk,ck) sunt toate tripletele care îndeplinesc condițiile de mai sus. Întrucât rezultatul poate fi foarte mare, afișați resul împărțirii valorii expresiei la numărul 1.000.000.007.&lt;br /&gt;
== Date de intrare ==&lt;br /&gt;
De la tastatură se citește numărul N.&lt;br /&gt;
== Date de ieșire ==&lt;br /&gt;
Pe ecran se va afișa un singur număr natural R reprezentând restul împărțirii rezultatului expresiei descrise anterior la numărul 1.000.000.007.&lt;br /&gt;
== Restricţii şi precizări ==&lt;br /&gt;
* &#039;&#039;&#039;1 ≤ n ≤ 1.000.000&#039;&#039;&#039;&lt;br /&gt;
== Exemplul 1 ==&lt;br /&gt;
; Intrare&lt;br /&gt;
&lt;br /&gt;
  4&lt;br /&gt;
; Ieșire&lt;br /&gt;
&lt;br /&gt;
  36&lt;br /&gt;
== Explicație ==&lt;br /&gt;
Tripletele valide sunt: (2, 3, 1), (3, 4, 1), (3, 2, 1), (4, 3, 1).&lt;br /&gt;
2*3*1 + 3*4*1 +3*2*1 + 4*3*1 = 36. Restul împărțirii numărului 36 la 1.000.000.007 este 36.&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;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&amp;lt;nowiki&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot; line&amp;gt;&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
def gcd(a, b):&lt;br /&gt;
&lt;br /&gt;
    while b:&lt;br /&gt;
&lt;br /&gt;
        a, b = b, a % b&lt;br /&gt;
&lt;br /&gt;
    return a&lt;br /&gt;
&lt;br /&gt;
def euler_totient(N):&lt;br /&gt;
&lt;br /&gt;
    phi = [i for i in range(N + 1)]&lt;br /&gt;
&lt;br /&gt;
    for i in range(2, N + 1):&lt;br /&gt;
&lt;br /&gt;
        if phi[i] == i:  # i este prim&lt;br /&gt;
&lt;br /&gt;
            for j in range(i, N + 1, i):&lt;br /&gt;
&lt;br /&gt;
                phi[j] -= phi[j] // i&lt;br /&gt;
&lt;br /&gt;
    return phi&lt;br /&gt;
&lt;br /&gt;
def main():&lt;br /&gt;
&lt;br /&gt;
    N = int(input(&amp;quot;Introduceți valoarea lui N: &amp;quot;))&lt;br /&gt;
&lt;br /&gt;
    totient = euler_totient(N)&lt;br /&gt;
&lt;br /&gt;
    result = 0&lt;br /&gt;
&lt;br /&gt;
    mod = 10**9 + 7&lt;br /&gt;
&lt;br /&gt;
    for p in range(2, N + 1):&lt;br /&gt;
&lt;br /&gt;
        for k in range(1, N // p + 1):&lt;br /&gt;
&lt;br /&gt;
            a = p * k&lt;br /&gt;
&lt;br /&gt;
            b = p * k + 1&lt;br /&gt;
&lt;br /&gt;
            if b &amp;gt; N:&lt;br /&gt;
&lt;br /&gt;
                break&lt;br /&gt;
&lt;br /&gt;
            c = p&lt;br /&gt;
&lt;br /&gt;
            result += a * b * c * totient[p] % mod&lt;br /&gt;
&lt;br /&gt;
            result %= mod&lt;br /&gt;
&lt;br /&gt;
    print(result)&lt;br /&gt;
&lt;br /&gt;
if __name__ == &amp;quot;__main__&amp;quot;:&lt;br /&gt;
&lt;br /&gt;
    main()&lt;br /&gt;
&lt;br /&gt;
&amp;lt;nowiki&amp;gt;&amp;lt;/syntaxhighlight&amp;gt;&amp;lt;/nowiki&amp;gt;&lt;/div&gt;</summary>
		<author><name>RebecaBud</name></author>
	</entry>
	<entry>
		<id>https://wiki.universitas.ro/index.php?title=3649_-_CMMDC_4&amp;diff=10010</id>
		<title>3649 - CMMDC 4</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=3649_-_CMMDC_4&amp;diff=10010"/>
		<updated>2024-06-03T16:44:00Z</updated>

		<summary type="html">&lt;p&gt;RebecaBud: Pagină nouă: == Enunt == == Cerinţa == Dându-se N, determinați valoarea expresiei: a1•b1•c1 + a2•b2•c2 + ... + ak•bk•ck unde (a1,b1,c1), (a2,b2,c2), …, (ak,bk,ck) sunt toate tripletele care îndeplinesc condițiile de mai sus. Întrucât rezultatul poate fi foarte mare, afișați resul împărțirii valorii expresiei la numărul 1.000.000.007. == Date de intrare == De la tastatură se citește numărul N. == Date de ieșire == Pe ecran se va afișa un singur număr natura...&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Enunt ==&lt;br /&gt;
== Cerinţa ==&lt;br /&gt;
Dându-se N, determinați valoarea expresiei: a1•b1•c1 + a2•b2•c2 + ... + ak•bk•ck&lt;br /&gt;
unde (a1,b1,c1), (a2,b2,c2), …, (ak,bk,ck) sunt toate tripletele care îndeplinesc condițiile de mai sus. Întrucât rezultatul poate fi foarte mare, afișați resul împărțirii valorii expresiei la numărul 1.000.000.007.&lt;br /&gt;
== Date de intrare ==&lt;br /&gt;
De la tastatură se citește numărul N.&lt;br /&gt;
== Date de ieșire ==&lt;br /&gt;
Pe ecran se va afișa un singur număr natural R reprezentând restul împărțirii rezultatului expresiei descrise anterior la numărul 1.000.000.007.&lt;br /&gt;
== Restricţii şi precizări ==&lt;br /&gt;
* &#039;&#039;&#039;1 ≤ n ≤ 1.000.000&#039;&#039;&#039;&lt;br /&gt;
== Exemplul 1 ==&lt;br /&gt;
; Intrare&lt;br /&gt;
&lt;br /&gt;
  4&lt;br /&gt;
; Ieșire&lt;br /&gt;
&lt;br /&gt;
  36&lt;br /&gt;
== Explicație ==&lt;br /&gt;
Tripletele valide sunt: (2, 3, 1), (3, 4, 1), (3, 2, 1), (4, 3, 1).&lt;br /&gt;
2*3*1 + 3*4*1 +3*2*1 + 4*3*1 = 36. Restul împărțirii numărului 36 la 1.000.000.007 este 36.&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;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>RebecaBud</name></author>
	</entry>
	<entry>
		<id>https://wiki.universitas.ro/index.php?title=3385_-_Lumini_1&amp;diff=10007</id>
		<title>3385 - Lumini 1</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=3385_-_Lumini_1&amp;diff=10007"/>
		<updated>2024-06-03T16:41:36Z</updated>

		<summary type="html">&lt;p&gt;RebecaBud: Pagină nouă: == Enunt == Nicoleta, o fată curioasă, dorește să afle cine dintre colegii de clasă are bradul cu cele mai multe luminițe, cât și numărul de luminițe din acest brad. Fiind olimpică la informatică și iubind provocările, colegii i-au comunicat prin SMS doar numărul de divizori corespunzător numărului de luminițe din brad, acesta fiind și cel mai mic număr cu această proprietate. De exemplu, George, colegul de bancă, i-a dat numărul 5, corespunzător unui...&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Enunt ==&lt;br /&gt;
Nicoleta, o fată curioasă, dorește să afle cine dintre colegii de clasă are bradul cu cele mai multe luminițe, cât și numărul de luminițe din acest brad. Fiind olimpică la informatică și iubind provocările, colegii i-au comunicat prin SMS doar numărul de divizori corespunzător numărului de luminițe din brad, acesta fiind și cel mai mic număr cu această proprietate. De exemplu, George, colegul de bancă, i-a dat numărul 5, corespunzător unui număr de 16 luminițe, mai exact D16 = {1, 2, 4, 8, 16}, iar 16 este numărul cel mai mic cu exact 5 divizori. Mesajele colegilor vor fi de forma: NrDiv Nume, unde NrDiv reprezintă numărul de divizori, iar Nume reprezintă numele colegului care a trimis mesajul.&lt;br /&gt;
== Cerinţa ==&lt;br /&gt;
Scrieţi un program care să determine:&lt;br /&gt;
1) Numărul de luminițe din bradul cu cele mai multe luminițe.&lt;br /&gt;
2) Numele colegului care are bradul cu cele mai multe luminițe.&lt;br /&gt;
== Date de intrare ==&lt;br /&gt;
Fișierul de intrare lumini.in conţine pe prima linie cerința 1 sau 2. Pe a doua linie numărul n, reprezentând numărul colegilor Nicoletei, iar pe următoarele n linii vor fi mesajele colegilor, sub forma descrisă în enunţ, câte un mesaj pe o linie.&lt;br /&gt;
&lt;br /&gt;
Date de ieșire&lt;br /&gt;
== Date de ieșire ==&lt;br /&gt;
Fișierul de ieșire lumini.out va conţine o singură linie pe care va fi scris numărul de luminițe al bradului cu cele mai multe luminițe (cerința 1) sau numele primului coleg din lista primită care are bradul cu cele mai multe luminițe (cerința 2).&lt;br /&gt;
== Restricţii şi precizări ==&lt;br /&gt;
* 1 ≤ n ≤ 5000, n număr natural;&lt;br /&gt;
* 1 &amp;lt; NrDiv ≤ 120, NrDiv este număr natural;&lt;br /&gt;
* numele oricărui coleg are maximum 23 de caractere alfabetice;&lt;br /&gt;
* numărul maxim de luminițe din instalația de brad va fi 65536 (216).&lt;br /&gt;
== Exemplul 1 ==&lt;br /&gt;
; lumini.in&lt;br /&gt;
&lt;br /&gt;
  1&lt;br /&gt;
  3&lt;br /&gt;
  12 Tryp&lt;br /&gt;
  13 Mike&lt;br /&gt;
  14 Gymi&lt;br /&gt;
; lumini.out&lt;br /&gt;
&lt;br /&gt;
  4096&lt;br /&gt;
== Explicație ==&lt;br /&gt;
Tryp are o instalație cu 60 de luminițe.&lt;br /&gt;
Mike are o instalație cu 4096 de luminițe.&lt;br /&gt;
Gymi are o instalație cu 192 de luminițe.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Exemplul 2 ==&lt;br /&gt;
; lumini.in&lt;br /&gt;
&lt;br /&gt;
  2&lt;br /&gt;
  6&lt;br /&gt;
  22 Andreea&lt;br /&gt;
  26 Iustina&lt;br /&gt;
  40 Iuliana&lt;br /&gt;
  26 Andreia&lt;br /&gt;
  27 Corina&lt;br /&gt;
  30 Raluca&lt;br /&gt;
; lumini.out&lt;br /&gt;
&lt;br /&gt;
  Iustina&lt;br /&gt;
== Explicație ==&lt;br /&gt;
Iustina și Andreia, au fiecare câte o instalație cu 12288 de luminițe. Iustina apare prima în listă.&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;gt;&lt;br /&gt;
def calculate_lights(N, messages):&lt;br /&gt;
    max_divisors = 0&lt;br /&gt;
    max_lights = 0&lt;br /&gt;
    owner = &amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    for message in messages:&lt;br /&gt;
        divisors, name = message.split()&lt;br /&gt;
        divisors = int(divisors)&lt;br /&gt;
        lights = divisors * (divisors + 1) // 2&lt;br /&gt;
        if divisors &amp;gt; max_divisors or (divisors == max_divisors and lights &amp;gt; max_lights):&lt;br /&gt;
            max_divisors = divisors&lt;br /&gt;
            max_lights = lights&lt;br /&gt;
            owner = name&lt;br /&gt;
&lt;br /&gt;
    return max_lights if N == 1 else owner&lt;br /&gt;
&lt;br /&gt;
def main():&lt;br /&gt;
    with open(&amp;quot;lumini.in&amp;quot;, &amp;quot;r&amp;quot;) as fin:&lt;br /&gt;
        choice = int(fin.readline().strip())&lt;br /&gt;
        N = int(fin.readline().strip())&lt;br /&gt;
        messages = [fin.readline().strip() for _ in range(N)]&lt;br /&gt;
&lt;br /&gt;
    result = calculate_lights(N, messages)&lt;br /&gt;
&lt;br /&gt;
    with open(&amp;quot;lumini.out&amp;quot;, &amp;quot;w&amp;quot;) as fout:&lt;br /&gt;
        fout.write(str(result))&lt;br /&gt;
&lt;br /&gt;
if __name__ == &amp;quot;__main__&amp;quot;:&lt;br /&gt;
    main()&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>RebecaBud</name></author>
	</entry>
	<entry>
		<id>https://wiki.universitas.ro/index.php?title=3108_-_Dss&amp;diff=10004</id>
		<title>3108 - Dss</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=3108_-_Dss&amp;diff=10004"/>
		<updated>2024-06-03T16:37:52Z</updated>

		<summary type="html">&lt;p&gt;RebecaBud: Pagină nouă: == Enunt == Se dau N numere naturale s[1], s[2], …, s[N] și Q interogări de forma a b. == Cerinţa == Să se determine pentru fiecare interogare [a;b] numărul de subșiruri formate din elemente distincte ale secvenței s[a], s[a+1], s[a+2], …, s[b]. Prin secvență a șirului s se înțelege orice succesiune de elemente aflate pe poziții consecutive s[a], s[a+1], …, s[b], cu 1 ≤ a ≤ b ≤ N. Prin subșir al șirului s se înțelege orice succesiune de elemente a...&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Enunt ==&lt;br /&gt;
Se dau N numere naturale s[1], s[2], …, s[N] și Q interogări de forma a b.&lt;br /&gt;
== Cerinţa ==&lt;br /&gt;
Să se determine pentru fiecare interogare [a;b] numărul de subșiruri formate din elemente distincte ale secvenței s[a], s[a+1], s[a+2], …, s[b].&lt;br /&gt;
Prin secvență a șirului s se înțelege orice succesiune de elemente aflate pe poziții consecutive s[a], s[a+1], …, s[b], cu 1 ≤ a ≤ b ≤ N.&lt;br /&gt;
Prin subșir al șirului s se înțelege orice succesiune de elemente aflate pe poziții în ordine strict crescătoare, dar nu neapărat consecutive, sa1, sa2, …, sak cu 1 ≤ a1 &amp;lt; a2 &amp;lt; ... &amp;lt; ak ≤ N.&lt;br /&gt;
== Date de intrare ==&lt;br /&gt;
Fișierul de intrare dss.in conține pe primul rând numerele N și Q. Pe linia a doua sunt scrise N numere naturale separate prin câte un spațiu. Pe următoarele Q rânduri sunt scrise câte două numere naturale a b@, separate prin spațiu, reprezentând capetele intervalelor de interogare date.&lt;br /&gt;
== Date de ieșire ==&lt;br /&gt;
În fișierul de ieșire dss.out pe fiecare dintre primele Q rânduri este scris câte un număr natural reprezentând numărul tuturor subșirurilor formate din elemente distincte conținute în secvența din interogarea corespunzătoare.&lt;br /&gt;
== Restricţii şi precizări ==&lt;br /&gt;
* &#039;&#039;&#039;1 ≤ N ≤ 400.000&#039;&#039;&#039;&lt;br /&gt;
* &#039;&#039;&#039;1 ≤ Q ≤ 10.000&#039;&#039;&#039;&lt;br /&gt;
* &#039;&#039;&#039;1 ≤ s[k] ≤ N&#039;&#039;&#039;&lt;br /&gt;
* &#039;&#039;&#039;1 ≤ a ≤ b ≤ N&#039;&#039;&#039;&lt;br /&gt;
Numărul de subșiruri pentru fiecare interogare vor fi calculate modulo 1.000.000.007&lt;br /&gt;
== Exemplul 1 ==&lt;br /&gt;
; dss.in&lt;br /&gt;
&lt;br /&gt;
  5 3 &lt;br /&gt;
  1 2 3 2 3&lt;br /&gt;
  1 4&lt;br /&gt;
  2 5&lt;br /&gt;
  1 3&lt;br /&gt;
; dss.out&lt;br /&gt;
&lt;br /&gt;
  11&lt;br /&gt;
  8&lt;br /&gt;
  7&lt;br /&gt;
== Explicație  ==&lt;br /&gt;
* - Subșirurile formate din elemente distincte din secvența s[1..4]=(1 2 3 2) sunt 1, 2, 3, 2, 1 2, 1 3, 1 2, 2 3, 3 2, 1 2 3, 1 3 2, deci în total 11 subșiruri.&lt;br /&gt;
* - Subșirurile formate din elemente distincte din secvența s[2..5]=(2 3 2 3) sunt 2, 3, 2, 3, 2 3, 2 3, 3 2, 2 3, deci 8 subșiruri.&lt;br /&gt;
* - Subșirurile formate din elemente distincte din secvența s[1..3]=(1 2 3) sunt 1, 2, 3, 1 2, 1 3, 2 3, 1 2 3, deci 7 subșiruri.&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;gt;&lt;br /&gt;
def count_subsequences(s, a, b):&lt;br /&gt;
    MOD = 1000000007&lt;br /&gt;
    n = len(s)&lt;br /&gt;
    dp = [0] * (n + 1)&lt;br /&gt;
    last_seen = [-1] * (n + 1)&lt;br /&gt;
    dp[0] = 1&lt;br /&gt;
    for i in range(1, n + 1):&lt;br /&gt;
        dp[i] = (dp[i - 1] * 2) % MOD&lt;br /&gt;
        if last_seen[s[i - 1]] != -1:&lt;br /&gt;
            dp[i] = (dp[i] - dp[last_seen[s[i - 1]] - 1] + MOD) % MOD&lt;br /&gt;
        last_seen[s[i - 1]] = i&lt;br /&gt;
    return (dp[b] - dp[a - 1] + MOD) % MOD&lt;br /&gt;
&lt;br /&gt;
def main():&lt;br /&gt;
    with open(&amp;quot;dss.in&amp;quot;, &amp;quot;r&amp;quot;) as fin:&lt;br /&gt;
        N, Q = map(int, fin.readline().split())&lt;br /&gt;
        s = list(map(int, fin.readline().split()))&lt;br /&gt;
        queries = [list(map(int, line.split())) for line in fin]&lt;br /&gt;
&lt;br /&gt;
    with open(&amp;quot;dss.out&amp;quot;, &amp;quot;w&amp;quot;) as fout:&lt;br /&gt;
        for a, b in queries:&lt;br /&gt;
            fout.write(str(count_subsequences(s, a, b)) + &amp;quot;\n&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
if __name__ == &amp;quot;__main__&amp;quot;:&lt;br /&gt;
    main()&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>RebecaBud</name></author>
	</entry>
	<entry>
		<id>https://wiki.universitas.ro/index.php?title=3087_-_Lego&amp;diff=10003</id>
		<title>3087 - Lego</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=3087_-_Lego&amp;diff=10003"/>
		<updated>2024-06-03T16:35:19Z</updated>

		<summary type="html">&lt;p&gt;RebecaBud: Pagină nouă: == Enunt == Crina și Rareș pornesc în călătoria imaginară spre Deva și pentru aceasta fiecare își construiește câte un autocar din piese de lego. Pentru a nu crea blocaje în trafic, intrarea autocarelor în oraș este gestionată de un semnal pe care este scris un număr natural S. Astfel, fiecare autocar ce ajunge în dreptul semnalului, trebuie să aștepte, un număr de minute egal cu valoarea absolută a diferenței dintre S și numărul de identificare al aut...&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Enunt ==&lt;br /&gt;
Crina și Rareș pornesc în călătoria imaginară spre Deva și pentru aceasta fiecare își construiește câte un autocar din piese de lego. Pentru a nu crea blocaje în trafic, intrarea autocarelor în oraș este gestionată de un semnal pe care este scris un număr natural S. Astfel, fiecare autocar ce ajunge în dreptul semnalului, trebuie să aștepte, un număr de minute egal cu valoarea absolută a diferenței dintre S și numărul de identificare al autocarului său.&lt;br /&gt;
&lt;br /&gt;
Cei doi copii își împart în mod egal piesele de lego pe care sunt scrise cifre (fiecare copil are același număr de piese ca și celălalt, pentru fiecare cifră în parte), cu care formează numerele de identificare ale celor două autocare. Crina aranjează una lângă alta toate piesele sale și formează cifră cu cifră, numărul N1 de identificare al autocarului ei iar Rareș procedează la fel și formează numărul N2 pentru autocarul său. Pentru ca cele două numere să nu fie identice, copiii stabilesc ca N1 să fie strict mai mic decât numărul S al semnalului, iar numărul N2 strict mai mare decât S. În cazul în care vreunul din cele două numere nu poate fi construit din piesele împărțite, atunci autocarul respectiv va avea identificatorul 0 și va aștepta la semnal până trece celălalt autocar.&lt;br /&gt;
== Cerinţa ==&lt;br /&gt;
1. Determinați numerele N1 și N2 astfel încât, autocarul fiecărui copil să aștepte cât mai puține minute la semnal.&lt;br /&gt;
2. Știind că autocarele celor doi copii au ajuns în același timp în fața semnalului, determinați numărul minim de minute de așteptare ale autocarului care va trece primul de semnal.&lt;br /&gt;
== Date de intrare ==&lt;br /&gt;
Fișierul de intrare &#039;&#039;&#039;lego.in&#039;&#039;&#039; conține:&lt;br /&gt;
pe prima linie numărul natural C ce poate avea valorile 1 sau 2, reprezentând numărul cerinței;&lt;br /&gt;
pe cea de-a doua linie un singur număr natural S cu semnificația din enunț;&lt;br /&gt;
pe următoarele linii câte două numere naturale ni și ci, despărțite prin câte un spațiu, cu următoarea semnificație: ni reprezintă numărul pieselor cu cifra ci, pe care le are fiecare copil.&lt;br /&gt;
== Date de ieșire ==&lt;br /&gt;
Pentru C = 1, fișierul de ieșire lego.out va conține pe prima linie două numere naturale N1 și N2, în această ordine, despărțite printr-un spațiu, determinate conform cerinței 1.&lt;br /&gt;
Pentru C = 2, fișierul de ieșire lego.out va conține pe prima linie, un singur număr natural determinat conform cerinței 2.&lt;br /&gt;
== Restricţii şi precizări ==&lt;br /&gt;
* &#039;&#039;&#039;1 ≤ S ≤ 1018&#039;&#039;&#039;;&lt;br /&gt;
* fiecare copil are cel mult 19 piese;&lt;br /&gt;
* cifrele ci sunt distincte;&lt;br /&gt;
* pentru rezolvarea corectă a cerinței 1 se acordă 60 de puncte iar pentru rezolvarea corectă a cerinței 2 se acordă 40 de puncte.&lt;br /&gt;
== Exemplul 1 ==&lt;br /&gt;
; lego.in&lt;br /&gt;
&lt;br /&gt;
  1&lt;br /&gt;
  153&lt;br /&gt;
  1 7&lt;br /&gt;
  3 4&lt;br /&gt;
; lego.out&lt;br /&gt;
&lt;br /&gt;
  0 4447&lt;br /&gt;
== Explicație =&lt;br /&gt;
Se rezolvă doar cerința 1. Pe semnal este scris numărul 153. Fiecare copil are 3 piese cu cifra 4 și o piesă cu cifra 7. Crina nu poate construi cu aceste piese un număr mai mic decât 153, de aceea autocarul său este identificat cu numărul 0. Rareș construiește numărul N2 = 4447.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Exemplul 2 ==&lt;br /&gt;
; lego.in&lt;br /&gt;
&lt;br /&gt;
  2&lt;br /&gt;
  42&lt;br /&gt;
  1 3&lt;br /&gt;
  1 5&lt;br /&gt;
; lego.out&lt;br /&gt;
&lt;br /&gt;
  7&lt;br /&gt;
== Explicație ==&lt;br /&gt;
Se rezolvă doar cerința 2. Pe semnal este scris numărul 42. Fiecare copil are o cifră de 3 și o cifră de 5. Crina construiește numărul N1 = 35 și așteaptă la semnal 42 - 35 = 7 minute. Rareș construiește numărul N2 = 53 și așteaptă la semnal 53 - 42 = 11 minute. Numărul minim al minutelor de așteptare este 7.&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;gt;&lt;br /&gt;
def build_number(pieces):&lt;br /&gt;
    number = 0&lt;br /&gt;
    for i, piece in enumerate(pieces):&lt;br /&gt;
        number += piece * 10 ** i&lt;br /&gt;
    return number&lt;br /&gt;
&lt;br /&gt;
def main():&lt;br /&gt;
    with open(&amp;quot;lego.in&amp;quot;, &amp;quot;r&amp;quot;) as fin:&lt;br /&gt;
        c = int(fin.readline())&lt;br /&gt;
        s = int(fin.readline())&lt;br /&gt;
        pieces = [list(map(int, fin.readline().split())) for _ in range(2)]&lt;br /&gt;
&lt;br /&gt;
    if c == 1:&lt;br /&gt;
        n1_pieces = [min(pieces[0][i], s) for i in range(10)]&lt;br /&gt;
        n2_pieces = [min(pieces[1][i], s) for i in range(10)]&lt;br /&gt;
&lt;br /&gt;
        n1 = build_number(n1_pieces)&lt;br /&gt;
        n2 = build_number(n2_pieces)&lt;br /&gt;
&lt;br /&gt;
        print(n1, n2)&lt;br /&gt;
&lt;br /&gt;
    elif c == 2:&lt;br /&gt;
        min_wait = float(&#039;inf&#039;)&lt;br /&gt;
        for i in range(1, s):&lt;br /&gt;
            n1_pieces = [min(pieces[0][j], i) for j in range(10)]&lt;br /&gt;
            n2_pieces = [min(pieces[1][j], s - i) for j in range(10)]&lt;br /&gt;
            n1 = build_number(n1_pieces)&lt;br /&gt;
            n2 = build_number(n2_pieces)&lt;br /&gt;
            wait = abs(s - n1) + abs(s - n2)&lt;br /&gt;
            min_wait = min(min_wait, wait)&lt;br /&gt;
&lt;br /&gt;
        print(min_wait)&lt;br /&gt;
&lt;br /&gt;
if __name__ == &amp;quot;__main__&amp;quot;:&lt;br /&gt;
    main()&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>RebecaBud</name></author>
	</entry>
	<entry>
		<id>https://wiki.universitas.ro/index.php?title=2438_-_Pal&amp;diff=10000</id>
		<title>2438 - Pal</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=2438_-_Pal&amp;diff=10000"/>
		<updated>2024-06-03T16:30:18Z</updated>

		<summary type="html">&lt;p&gt;RebecaBud: Pagină nouă: == Enunt ==  Micul Prinț a ajuns în țara numerelor palindrom cu număr impar de cifre unde a primit de la sfetnicul regelui o listă care conține N numere naturale, fiecare cu număr impar de cifre. Un număr este palindrom dacă prima lui cifră este egală cu ultima, a doua cu penultima, ș.a.m.d. Acesta i-a transmis că regele este foarte bolnav. Odată cu regele, numerele din listă s-au îmbolnăvit și ele. Sfetnicul i-a spus că lista corectă poate fi obținută p...&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Enunt ==&lt;br /&gt;
&lt;br /&gt;
Micul Prinț a ajuns în țara numerelor palindrom cu număr impar de cifre unde a primit de la sfetnicul regelui o listă care conține N numere naturale, fiecare cu număr impar de cifre. Un număr este palindrom dacă prima lui cifră este egală cu ultima, a doua cu penultima, ș.a.m.d. Acesta i-a transmis că regele este foarte bolnav. Odată cu regele, numerele din listă s-au îmbolnăvit și ele. Sfetnicul i-a spus că lista corectă poate fi obținută prin înlocuirea fiecărui număr din ea cu cel mai mic palindrom mai mare sau egal cu numărul respectiv.&lt;br /&gt;
După ce a urmat recomandarea sfetnicului, Micul Prinț a constatat că în lista corectă obținută toate palindromurile sunt distincte. Uitându-se mai cu atenție la palindromurile din această listă, a observat că există perechi de palindromuri în care cel mai mic se poate obține din cel mai mare prin ștergerea aceluiași număr de cifre de la ambele capete. De exemplu pentru perechea 7531357 și 313 palindromul 313 se obține din 7531357 prin eliminarea a câte două cifre de la ambele capete ale sale.&lt;br /&gt;
Considerăm un șir de palindromuri din lista corectă și notăm cu X valoarea maximă a acestui șir. Vom spune că șirul este magic dacă toate palindromurile din el se pot obține după metoda descrisă mai sus, din palindromul de valoare X. Un exemplu de șir magic este 4, 53435, 7534357, 89753435798, presupunând că toate aceste numere se regăsesc în lista corectă.&lt;br /&gt;
== Cerinţa ==&lt;br /&gt;
Scrieți un program care citește numerele din lista primită de la sfetnicul regelui și afișează:&lt;br /&gt;
1) Lista corectă obținută de Micul Prinț;&lt;br /&gt;
2) Numărul de elemente ale celui mai lung șir magic care se poate obține din lista corectă;&lt;br /&gt;
3) Palindromurile din care este format cel mai lung șir magic, afișate în ordine crescătoare. Dacă există mai multe astfel de șiruri în lista corectă a Micului Prinț, se va afișa cel în care ultimul număr este cel mai mare.&lt;br /&gt;
== Date de intrare ==&lt;br /&gt;
Fișierul de intrare &#039;&#039;&#039;pal.in&#039;&#039;&#039; conţine pe prima linie numărul natural P, care nu poate avea decât valorile 1, 2 sau 3 și indică numărul cerinței care va fi rezolvată. Pe a doua linie numărul natural N de numere de pe lista primită de la sfetnicul regelui. Pe a treia linie se află numerele naturale din lista primită de la sfetnic, separate prin câte un spațiu.&lt;br /&gt;
== Date de ieșire ==&lt;br /&gt;
Fișierul de ieșire &#039;&#039;&#039;pal.out&#039;&#039;&#039; va conţine pe prima linie răspunsul la cerința rezolvată. Dacă s-a rezolvat prima cerință, fișierul de ieșire va conține un șir de N numere naturale, separate prin câte un spațiu, reprezentând numerele din lista corectă, în ordinea corespunzătoare listei inițiale. Dacă s-a rezolvat cerința 2, pe prima linie a fișierului de ieșire se va scrie lungimea celui mai lung șir magic. Dacă s-a rezolvat cerința 3, fișierul de ieșire va conține numerele determinate și afișate conform cerinței.&lt;br /&gt;
== Restricţii şi precizări ==&lt;br /&gt;
* &#039;&#039;&#039;0 &amp;lt; N ≤ 50.000&#039;&#039;&#039;;&lt;br /&gt;
* Numerele de pe lista sfetnicului sunt naturale nenule și fiecare are cel mult 17 cifre;&lt;br /&gt;
* Pentru rezolvarea corectă a primei cerinţe se acordă 20 de puncte, pentru rezolvarea corectă a celei de a doua cerințe se acordă 20 de puncte, iar pentru rezolvarea corectă a celei de a treia cerințe se acordă 50 de puncte.&lt;br /&gt;
* În concurs s-au acordat 10 puncte din oficiu. Aici se vor acorda pentru exemplele din enunț.&lt;br /&gt;
== Exemplul 1 ==&lt;br /&gt;
; pal.in&lt;br /&gt;
&lt;br /&gt;
  1&lt;br /&gt;
  3&lt;br /&gt;
  345 214 64325&lt;br /&gt;
; pal.out&lt;br /&gt;
&lt;br /&gt;
  353 222 64346&lt;br /&gt;
== Explicație ==&lt;br /&gt;
Șirul palindromurilor de pe lista corectă obținută de Micul Prinț.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Exemplul 2 ==&lt;br /&gt;
; pal.in&lt;br /&gt;
&lt;br /&gt;
  2&lt;br /&gt;
  8&lt;br /&gt;
  2 3 120 4 432 5643461 7 21211&lt;br /&gt;
; pal.out&lt;br /&gt;
&lt;br /&gt;
  3&lt;br /&gt;
== Explicație ==&lt;br /&gt;
Lista corectă conține palindromurile 2 3 121 4 21212 434 5643465 7 și cel mai lung șir magic este 3 434 5643465.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Exemplul 3 ==&lt;br /&gt;
; pal.in&lt;br /&gt;
&lt;br /&gt;
  3&lt;br /&gt;
  8&lt;br /&gt;
  2 3 5643461 7 120 4 21211 432&lt;br /&gt;
; pal.out&lt;br /&gt;
&lt;br /&gt;
  3 434 5643465&lt;br /&gt;
== Explicație ==&lt;br /&gt;
Șirul magic 2 121 21212 are aceeași lungime dar se termină într-un număr mai mic.&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;gt;&lt;br /&gt;
def is_palindrome(num):&lt;br /&gt;
    return str(num) == str(num)[::-1]&lt;br /&gt;
&lt;br /&gt;
def next_palindrome(num):&lt;br /&gt;
    num += 1&lt;br /&gt;
    while not is_palindrome(num):&lt;br /&gt;
        num += 1&lt;br /&gt;
    return num&lt;br /&gt;
&lt;br /&gt;
def prev_palindrome(num):&lt;br /&gt;
    num -= 1&lt;br /&gt;
    while not is_palindrome(num):&lt;br /&gt;
        num -= 1&lt;br /&gt;
    return num&lt;br /&gt;
&lt;br /&gt;
def find_longest_magic_sequence(palindromes):&lt;br /&gt;
    n = len(palindromes)&lt;br /&gt;
    dp = [[0] * n for _ in range(n)]&lt;br /&gt;
    max_length = 1&lt;br /&gt;
&lt;br /&gt;
    for i in range(n):&lt;br /&gt;
        dp[i][i] = 1&lt;br /&gt;
&lt;br /&gt;
    for length in range(2, n + 1):&lt;br /&gt;
        for i in range(n - length + 1):&lt;br /&gt;
            j = i + length - 1&lt;br /&gt;
            if length == 2 and palindromes[i] == palindromes[j]:&lt;br /&gt;
                dp[i][j] = 2&lt;br /&gt;
                max_length = max(max_length, 2)&lt;br /&gt;
            elif palindromes[i] == palindromes[j] and dp[i + 1][j - 1] == length - 2:&lt;br /&gt;
                dp[i][j] = length&lt;br /&gt;
                max_length = max(max_length, length)&lt;br /&gt;
&lt;br /&gt;
    return max_length&lt;br /&gt;
&lt;br /&gt;
def main():&lt;br /&gt;
    with open(&amp;quot;pal.in&amp;quot;, &amp;quot;r&amp;quot;) as fin:&lt;br /&gt;
        p = int(fin.readline())&lt;br /&gt;
        n = int(fin.readline())&lt;br /&gt;
        numbers = list(map(int, fin.readline().split()))&lt;br /&gt;
&lt;br /&gt;
    if p == 1:&lt;br /&gt;
        correct_numbers = [next_palindrome(num) for num in numbers]&lt;br /&gt;
        with open(&amp;quot;pal.out&amp;quot;, &amp;quot;w&amp;quot;) as fout:&lt;br /&gt;
            fout.write(&amp;quot; &amp;quot;.join(map(str, correct_numbers)))&lt;br /&gt;
    elif p == 2:&lt;br /&gt;
        max_length = find_longest_magic_sequence(numbers)&lt;br /&gt;
        with open(&amp;quot;pal.out&amp;quot;, &amp;quot;w&amp;quot;) as fout:&lt;br /&gt;
            fout.write(f&amp;quot;{max_length}\n&amp;quot;)&lt;br /&gt;
    elif p == 3:&lt;br /&gt;
        max_length = find_longest_magic_sequence(numbers)&lt;br /&gt;
        max_palindromes = []&lt;br /&gt;
        for i in range(n):&lt;br /&gt;
            for j in range(i + 1, n):&lt;br /&gt;
                if numbers[i] == numbers[j]:&lt;br /&gt;
                    palindromes = [numbers[k] for k in range(i, j + 1)]&lt;br /&gt;
                    if find_longest_magic_sequence(palindromes) == max_length:&lt;br /&gt;
                        max_palindromes = palindromes&lt;br /&gt;
        with open(&amp;quot;pal.out&amp;quot;, &amp;quot;w&amp;quot;) as fout:&lt;br /&gt;
            fout.write(&amp;quot; &amp;quot;.join(map(str, max_palindromes)))&lt;br /&gt;
&lt;br /&gt;
if __name__ == &amp;quot;__main__&amp;quot;:&lt;br /&gt;
    main()&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>RebecaBud</name></author>
	</entry>
	<entry>
		<id>https://wiki.universitas.ro/index.php?title=2157_-_Bomboane_3&amp;diff=9998</id>
		<title>2157 - Bomboane 3</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=2157_-_Bomboane_3&amp;diff=9998"/>
		<updated>2024-06-03T16:26:33Z</updated>

		<summary type="html">&lt;p&gt;RebecaBud: Pagină nouă: == Enunt == Zeno are n cutii cu bomboane, iar în fiecare cutie se găsește un număr natural nenul de bomboane. Zeno poate împărți bomboanele din toate cutiile colegilor în două moduri: frățește sau diferențiat. Împărțirea frățească se realizează astfel:  numărul de colegi care primesc bomboane din fiecare cutie este același (dacă din prima cutie primesc bomboane k colegi și din cutia 2 vor primi tot k colegi, și din cutia 3 tot k colegi etc). bomboanel...&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Enunt ==&lt;br /&gt;
Zeno are n cutii cu bomboane, iar în fiecare cutie se găsește un număr natural nenul de bomboane. Zeno poate împărți bomboanele din toate cutiile colegilor în două moduri: frățește sau diferențiat. Împărțirea frățească se realizează astfel:&lt;br /&gt;
&lt;br /&gt;
numărul de colegi care primesc bomboane din fiecare cutie este același (dacă din prima cutie primesc bomboane k colegi și din cutia 2 vor primi tot k colegi, și din cutia 3 tot k colegi etc).&lt;br /&gt;
bomboanele din fiecare cutie se împart în mod egal între cei k colegi, aceștia primind un număr nenul de bomboane;&lt;br /&gt;
în final în fiecare cutie trebuie să rămână un număr identic de bomboane (posibil zero) care îi revin lui Zeno. De exemplu dacă n = 3, iar în cutii se găsesc 14, 23 respectiv 17 bomboane, din prima cutie oferă câte 4 bomboane pentru 3 colegi, din a doua cutie câte 7 bomboane pentru 3 colegi, iar din ultima cutie câte 5 bomboane pentru 3 colegi, iar în fiecare cutie rămân 2 bomboane.&lt;br /&gt;
Împărțirea diferențiată se realizează în felul următor:&lt;br /&gt;
&lt;br /&gt;
dintre colegii care primesc bomboane din aceeași cutie fiecare coleg primește un număr diferit de bomboane (număr nenul), neexistând doi colegi care primesc număr identic de bomboane din aceeași cutie;&lt;br /&gt;
din fiecare cutie Zeno oferă bomboane unui număr cât mai mare de colegi.&lt;br /&gt;
diferențele în modul dintre numărul de bomboane primite consecutiv de doi colegi sunt distincte două câte două. De exemplu dacă n = 3, iar în cutii se găsesc 14, 23 respectiv 17 bomboane, bomboanele din prima cutie se pot împărți astfel (3, 4, 6, 1), bomboanele din a doua cutie (6, 2, 7, 1, 3, 4), iar bomboanele din a treia cutie se pot împărți astfel (2, 1, 3, 7, 4).&lt;br /&gt;
== Cerinţa ==&lt;br /&gt;
Cunoscând n numărul de cutii și numărul de bomboane din fiecare cutie să se scrie un program care determină:&lt;br /&gt;
&lt;br /&gt;
a) Numărul maxim de colegi care pot primi bomboane, dacă Zeno alege împărțirea frățească.&lt;br /&gt;
b) O modalitate de împărțire a bomboanelor din fiecare cutie, dacă se face împărțirea diferențiată.&lt;br /&gt;
== Date de intrare ==&lt;br /&gt;
Fișierul de intrare &#039;&#039;&#039;bomboane3.in&#039;&#039;&#039; conține pe prima linie două numere naturale p (numărul cerinței de rezolvat), și n (numărul de cutii), despărțite printr-un spațiu. Pe următoarea linie se găsesc n valori naturale, separate prin câte un spațiu, reprezentând numărul de bomboane din fiecare cutie.&lt;br /&gt;
== Date de ieșire ==&lt;br /&gt;
Dacă p = 1 se va rezolva numai punctul a) din cerință. În acest caz fișierul de ieșire bomboane3.out va conține o valoare naturală reprezentând numărul maxim de colegi care pot primi bomboane, dacă Zeno alege împărțirea frățească.&lt;br /&gt;
Dacă p = 2 se rezolvă numai punctul b). Fișierul de ieșire bomboane3.out va conține n linii. Pe fiecare linie i, prima valoare nri reprezintă numărul maxim de colegi care pot primi bomboane din cutia i, urmată de nri valori separate prin câte un spațiu reprezentând o modalitate de împărțire a bomboanelor din cutia i, dacă Zeno alege împărțirea diferențiată.&lt;br /&gt;
== Restricţii şi precizări ==&lt;br /&gt;
* &#039;&#039;&#039;1 ≤ p ≤ 2&#039;&#039;&#039;;&lt;br /&gt;
* Dacă p = 1 atunci 1 ≤ n ≤ 10 000 și 1 ≤ numărul de bomboane din cutii ≤  106.&lt;br /&gt;
* Dacă p = 2 atunci 1 ≤ n ≤ 200 și 1 ≤ numărul de bomboane din cutii ≤  100 000.&lt;br /&gt;
* Dacă există mai multe soluții se poate afișa oricare.&lt;br /&gt;
* Pentru rezolvarea fiecărei cerințe se acordă 50% din punctaj.&lt;br /&gt;
== Exemplul 1 ==&lt;br /&gt;
; bomboane3.in&lt;br /&gt;
&lt;br /&gt;
  1 3&lt;br /&gt;
  14 23 17&lt;br /&gt;
; bomboane3.out&lt;br /&gt;
&lt;br /&gt;
  3&lt;br /&gt;
== Explicație == &lt;br /&gt;
Se rezolvă numai punctul a). Numărul maxim de colegi care pot primi bomboane dacă Zeno alege împărțirea frățească e 3.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Exemplul 2 ==&lt;br /&gt;
; bomboane3.in&lt;br /&gt;
&lt;br /&gt;
  2 3&lt;br /&gt;
  14 23 17&lt;br /&gt;
; bomboane3.out&lt;br /&gt;
&lt;br /&gt;
  4 3 4 6 1&lt;br /&gt;
  6 6 2 7 1 3 4 &lt;br /&gt;
  5 2 1 3 7 4&lt;br /&gt;
== Explicație ==&lt;br /&gt;
Se rezolvă numai punctul b). Din prima cutie pot primi bomboane maxim 4 colegi. O modalitate de împărțire astfel încât fiecare coleg să primească un număr diferit de bomboane, iar diferențele dintre bomboanele primite de doi colegi consecutivi să fie distincte două câte două este (3,4,6,1). Este corectă și soluția (1, 2, 7, 4).&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;gt;&lt;br /&gt;
def max_colleagues_fraternally(boxes):&lt;br /&gt;
    min_bombs = min(boxes)&lt;br /&gt;
    max_colleagues = 0&lt;br /&gt;
    for i in range(1, min_bombs + 1):&lt;br /&gt;
        valid = True&lt;br /&gt;
        for box in boxes:&lt;br /&gt;
            if box % i != 0:&lt;br /&gt;
                valid = False&lt;br /&gt;
                break&lt;br /&gt;
        if valid:&lt;br /&gt;
            max_colleagues = max(max_colleagues, i)&lt;br /&gt;
    return max_colleagues&lt;br /&gt;
&lt;br /&gt;
def division_differently(boxes):&lt;br /&gt;
    min_bombs = min(boxes)&lt;br /&gt;
    max_colleagues = min_bombs&lt;br /&gt;
    result = []&lt;br /&gt;
    for box in boxes:&lt;br /&gt;
        diff = max_colleagues - min_bombs&lt;br /&gt;
        curr_division = [min_bombs + i * (diff + 1) for i in range(min_bombs)]&lt;br /&gt;
        result.append((max_colleagues, curr_division))&lt;br /&gt;
    return result&lt;br /&gt;
&lt;br /&gt;
def main():&lt;br /&gt;
    with open(&amp;quot;bomboane3.in&amp;quot;, &amp;quot;r&amp;quot;) as fin:&lt;br /&gt;
        p, n = map(int, fin.readline().split())&lt;br /&gt;
        boxes = list(map(int, fin.readline().split()))&lt;br /&gt;
&lt;br /&gt;
    if p == 1:&lt;br /&gt;
        max_colleagues = max_colleagues_fraternally(boxes)&lt;br /&gt;
        with open(&amp;quot;bomboane3.out&amp;quot;, &amp;quot;w&amp;quot;) as fout:&lt;br /&gt;
            fout.write(f&amp;quot;{max_colleagues}\n&amp;quot;)&lt;br /&gt;
    elif p == 2:&lt;br /&gt;
        divisions = division_differently(boxes)&lt;br /&gt;
        with open(&amp;quot;bomboane3.out&amp;quot;, &amp;quot;w&amp;quot;) as fout:&lt;br /&gt;
            for division in divisions:&lt;br /&gt;
                fout.write(f&amp;quot;{division[0]} {&#039; &#039;.join(map(str, division[1]))}\n&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
if __name__ == &amp;quot;__main__&amp;quot;:&lt;br /&gt;
    main()&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>RebecaBud</name></author>
	</entry>
	<entry>
		<id>https://wiki.universitas.ro/index.php?title=1969_-_P_Digit&amp;diff=9995</id>
		<title>1969 - P Digit</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=1969_-_P_Digit&amp;diff=9995"/>
		<updated>2024-06-03T16:23:06Z</updated>

		<summary type="html">&lt;p&gt;RebecaBud: Pagină nouă: == Enunt == Fie a un număr natural scris în baza 10. Notăm cu b, baza minimă în care poate fi scris a. Astfel, dacă a=21756, atunci baza minimă în care acesta poate fi scris este b=8.  Definim &amp;#039;&amp;#039;&amp;#039;&amp;#039;cifra de control&amp;#039;&amp;#039;&amp;#039; a numărului a scris în baza b, notată cu c=digit(a)b, ca fiind numărul de o cifră obținut prin adunarea în baza b a cifrelor numărului a. Dacă rezultatul obținut este de o cifră, atunci acesta reprezintă valoarea lui c, dacă nu, se aplică re...&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Enunt ==&lt;br /&gt;
Fie a un număr natural scris în baza 10. Notăm cu b, baza minimă în care poate fi scris a. Astfel, dacă a=21756, atunci baza minimă în care acesta poate fi scris este b=8.&lt;br /&gt;
&lt;br /&gt;
Definim &#039;&#039;&#039;&#039;cifra de control&#039;&#039;&#039; a numărului a scris în baza b, notată cu c=digit(a)b, ca fiind numărul de o cifră obținut prin adunarea în baza b a cifrelor numărului a. Dacă rezultatul obținut este de o cifră, atunci acesta reprezintă valoarea lui c, dacă nu, se aplică repetat asupra rezultatului procedeul de însumare a cifrelor în baza b până când se obține o cifră.&lt;br /&gt;
&lt;br /&gt;
De exemplu:&lt;br /&gt;
&lt;br /&gt;
c=digit(21756)8=digit(2+1+7+5+6)8=25, întrucât c&amp;gt;8 procedeul continuă&lt;br /&gt;
c=digit(25)8=digit(2+5)8=7.&lt;br /&gt;
== Cerinţa ==&lt;br /&gt;
Se consideră un interval închis [x,y]. Să se determine:&lt;br /&gt;
&lt;br /&gt;
* a – primul număr prim mai mare sau egal ca x&lt;br /&gt;
* b – baza minimă în care poate fi scris numărul prim a&lt;br /&gt;
* c – cifra de control a numărului prim a&lt;br /&gt;
* n – numărul de numere prime din intervalul [x,y] ce pot fi scrise în baza b și au cifra de control egală cu c.&lt;br /&gt;
== Date de intrare ==&lt;br /&gt;
Fișierul de intrare &#039;&#039;&#039;pdigit.in&#039;&#039;&#039; conține pe o singură linie două valori natural x și y cu semnificația din enunț.&lt;br /&gt;
== Date de ieșire ==&lt;br /&gt;
Fișierul de ieșire &#039;&#039;&#039;pdigit.out&#039;&#039;&#039; va conține patru valori naturale a, b, c și n, scrise fiecare pe câte o linie, valori ce reprezintă în ordine: primul număr prim strict mai mare sau egal ca x, baza minimă în care poate fi scris numărul prim a, cifra de control a numărului prim a, numărul de numere prime scrise în baza b din intervalul [x,y] care au cifra de control egală cu c.&lt;br /&gt;
== Restricţii şi precizări ==&lt;br /&gt;
* &#039;&#039;&#039;1 ≤ x ≤ y ≤ 5000000&#039;&#039;&#039;&lt;br /&gt;
* intervalul [x,y] conține cel puțin un număr prim&lt;br /&gt;
* rezolvarea primei cerințe asigură 10% din punctaj&lt;br /&gt;
* rezolvarea cerinței a doua asigură 10% din punctaj&lt;br /&gt;
* rezolvarea cerinței a treia asigură 20% din punctaj&lt;br /&gt;
* Rezolvarea ultimei cerințe asigură 60% din punctaj&lt;br /&gt;
== Exemplul 1 ==&lt;br /&gt;
; pdigit.in&lt;br /&gt;
&lt;br /&gt;
  15 75&lt;br /&gt;
; pdigit.out&lt;br /&gt;
&lt;br /&gt;
  17&lt;br /&gt;
  8&lt;br /&gt;
  1&lt;br /&gt;
  3 &lt;br /&gt;
== Explicație == &lt;br /&gt;
Primul număr prim din interval este 17. Baza minimă în care poate fi scris numărul prim este 8.&lt;br /&gt;
* Cifra de contro a numărului prim este 1. Sunt 3 numere prime în intervalul dat ce pot fi scrise în baza 8, și au cifra de control egală cu 1: 17, 53, 71.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&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;gt;&lt;br /&gt;
def is_prime(n):&lt;br /&gt;
    if n &amp;lt;= 1:&lt;br /&gt;
        return False&lt;br /&gt;
    if n &amp;lt;= 3:&lt;br /&gt;
        return True&lt;br /&gt;
    if n % 2 == 0 or n % 3 == 0:&lt;br /&gt;
        return False&lt;br /&gt;
    i = 5&lt;br /&gt;
    while i * i &amp;lt;= n:&lt;br /&gt;
        if n % i == 0 or n % (i + 2) == 0:&lt;br /&gt;
            return False&lt;br /&gt;
        i += 6&lt;br /&gt;
    return True&lt;br /&gt;
&lt;br /&gt;
def digit_sum(num, base):&lt;br /&gt;
    result = sum(int(digit, base=base) for digit in str(num))&lt;br /&gt;
    while result &amp;gt;= base:&lt;br /&gt;
        result = sum(int(digit, base=base) for digit in str(result))&lt;br /&gt;
    return result&lt;br /&gt;
&lt;br /&gt;
def prime_in_interval(x, y):&lt;br /&gt;
    for num in range(x, y+1):&lt;br /&gt;
        if is_prime(num):&lt;br /&gt;
            return num&lt;br /&gt;
    return None&lt;br /&gt;
&lt;br /&gt;
def minimum_base(prime):&lt;br /&gt;
    return min(prime, 8)&lt;br /&gt;
&lt;br /&gt;
def control_digit(prime, base):&lt;br /&gt;
    return digit_sum(prime, base)&lt;br /&gt;
&lt;br /&gt;
def primes_with_control_digit(x, y, base, control_digit):&lt;br /&gt;
    count = 0&lt;br /&gt;
    for num in range(x, y+1):&lt;br /&gt;
        if is_prime(num):&lt;br /&gt;
            if digit_sum(num, base) == control_digit:&lt;br /&gt;
                count += 1&lt;br /&gt;
    return count&lt;br /&gt;
&lt;br /&gt;
def main():&lt;br /&gt;
    with open(&amp;quot;pdigit.in&amp;quot;, &amp;quot;r&amp;quot;) as fin:&lt;br /&gt;
        x, y = map(int, fin.readline().split())&lt;br /&gt;
&lt;br /&gt;
    prime = prime_in_interval(x, y)&lt;br /&gt;
    base = minimum_base(prime)&lt;br /&gt;
    control = control_digit(prime, base)&lt;br /&gt;
    count = primes_with_control_digit(x, y, base, control)&lt;br /&gt;
&lt;br /&gt;
    with open(&amp;quot;pdigit.out&amp;quot;, &amp;quot;w&amp;quot;) as fout:&lt;br /&gt;
        fout.write(f&amp;quot;{prime}\n&amp;quot;)&lt;br /&gt;
        fout.write(f&amp;quot;{base}\n&amp;quot;)&lt;br /&gt;
        fout.write(f&amp;quot;{control}\n&amp;quot;)&lt;br /&gt;
        fout.write(f&amp;quot;{count}\n&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
if __name__ == &amp;quot;__main__&amp;quot;:&lt;br /&gt;
    main()&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>RebecaBud</name></author>
	</entry>
	<entry>
		<id>https://wiki.universitas.ro/index.php?title=1968_-_Bloc&amp;diff=9990</id>
		<title>1968 - Bloc</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=1968_-_Bloc&amp;diff=9990"/>
		<updated>2024-06-03T16:19:27Z</updated>

		<summary type="html">&lt;p&gt;RebecaBud: Pagină nouă: == Cerinţa == Cifrele de la 1 la K se scriu într-un şir, iar secvenţa obţinută se repetă la nesfârşit. De exemplu, pentru K=9 se obţine şirul: 1 2 3 4 5 6 7 8 9 1 2 3 4 5 6 7 8 9 1 2 3 4 5 6 7 8 9 …. Asupra unui asemenea şir se aplică succesiv operaţia de rostogolire de lungime P, ce presupune ca blocul format cu cifrele de pe primele P poziţii să se rotească cu 1800 şi să se scrie deasupra următoarei secvenţe de lungime P. În cazul exemplului anterior...&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Cerinţa ==&lt;br /&gt;
Cifrele de la 1 la K se scriu într-un şir, iar secvenţa obţinută se repetă la nesfârşit. De exemplu, pentru K=9 se obţine şirul: 1 2 3 4 5 6 7 8 9 1 2 3 4 5 6 7 8 9 1 2 3 4 5 6 7 8 9 …. Asupra unui asemenea şir se aplică succesiv operaţia de rostogolire de lungime P, ce presupune ca blocul format cu cifrele de pe primele P poziţii să se rotească cu 1800 şi să se scrie deasupra următoarei secvenţe de lungime P. În cazul exemplului anterior, pentru P=3, vom obţine după 4 operaţii de rostogolire de lungime 3:&lt;br /&gt;
Pas 1: 3 2 1&lt;br /&gt;
     4 5 6 7 8 9 1 2 3 4 5 6 7 8 9 1 2 3 4 5 6 7 8 9…&lt;br /&gt;
&lt;br /&gt;
Pas 2: 6 5 4   &lt;br /&gt;
     1 2 3&lt;br /&gt;
     7 8 9 1 2 3 4 5 6 7 8 9 1 2 3 4 5 6 7 8 9…&lt;br /&gt;
&lt;br /&gt;
Pas 3: 9 8 7&lt;br /&gt;
     3 2 1&lt;br /&gt;
     4 5 6&lt;br /&gt;
     1 2 3 4 5 6 7 8 9 1 2 3 4 5 6 7 8 9…&lt;br /&gt;
&lt;br /&gt;
Pas 4: 3 2 1&lt;br /&gt;
     6 5 4&lt;br /&gt;
     1 2 3&lt;br /&gt;
     7 8 9&lt;br /&gt;
     4 5 6 7 8 9 1 2 3 4 5 6 7 8 9…&lt;br /&gt;
Astfel pe primele P poziţii se formează un bloc având la bază P cifre şi înălţimea N+1, unde N este numărul de rostogoliri de lungime P.&lt;br /&gt;
Pentru K, P şi N date se cer următoarele:&lt;br /&gt;
a) Suma elementelor blocului după N rostogoliri de lungime P.&lt;br /&gt;
b) Suma maximă a elementelor de pe o coloană a blocului după N rostogoliri de lungime P.&lt;br /&gt;
c) Dacă liniile blocului le privim ca pe nişte numere cu P cifre, să se afle cel mai mic dintre aceste numere ale blocului obţinut după N rostogoliri de lungime P.&lt;br /&gt;
== Date de intrare ==&lt;br /&gt;
Fişierul de intrare bloc.in conţine pe prima linie numerele K, P şi N ce reprezintă cifra maximă din şirul iniţial, lungimea secvenţei care se rostogoleşte, respectiv numărul de rostogoliri.&lt;br /&gt;
== Date de ieșire ==&lt;br /&gt;
Fişierul de ieşire bloc.out va conţine pe prima linie suma elementelor blocului după N rostogoliri, pe a doua linie suma maximă a elementelor unei coloane a blocului după N rostogoliri, iar pe a treia linie numărul minim format din cifrele unei linii a blocului după N rostogoliri.&lt;br /&gt;
== Restricţii şi precizări ==&lt;br /&gt;
* &#039;&#039;&#039;1 ≤  K ≤ 9&#039;&#039;&#039;&lt;br /&gt;
* &#039;&#039;&#039;1 ≤  P ≤ 100&#039;&#039;&#039;&lt;br /&gt;
* &#039;&#039;&#039;1 ≤  N ≤ 1.000.000&#039;&#039;&#039;&lt;br /&gt;
* Prima cerinţă se notează cu 40p, a doua cu 40p, iar a treia cu 20p&lt;br /&gt;
== Exemplul 1 ==&lt;br /&gt;
; bloc.in&lt;br /&gt;
&lt;br /&gt;
  9 3 4&lt;br /&gt;
; bloc.out&lt;br /&gt;
&lt;br /&gt;
  66&lt;br /&gt;
  23&lt;br /&gt;
  123&lt;br /&gt;
== Explicație ==&lt;br /&gt;
Datele corespund exemplului de mai sus. La pasul 4 suma elementelor blocului este 66, coloana a treia a blocului are suma 1+4+3+9+6=23 care este maximă, iar cifrele de pe linia a treia a blocului formează numărul minim 123.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&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;gt;&lt;br /&gt;
def rotate_sequence(sequence, P):&lt;br /&gt;
    return sequence[P-1::-1] + sequence[P:]&lt;br /&gt;
&lt;br /&gt;
def rotate_block(block, P):&lt;br /&gt;
    return [rotate_sequence(row, P) for row in block]&lt;br /&gt;
&lt;br /&gt;
def sum_block(block):&lt;br /&gt;
    return sum(sum(row) for row in block)&lt;br /&gt;
&lt;br /&gt;
def max_column_sum(block):&lt;br /&gt;
    max_sum = 0&lt;br /&gt;
    for j in range(len(block[0])):&lt;br /&gt;
        column_sum = sum(block[i][j] for i in range(len(block)))&lt;br /&gt;
        max_sum = max(max_sum, column_sum)&lt;br /&gt;
    return max_sum&lt;br /&gt;
&lt;br /&gt;
def min_line_number(block):&lt;br /&gt;
    min_number = int(&#039;&#039;.join(map(str, block[0])))&lt;br /&gt;
    for row in block[1:]:&lt;br /&gt;
        number = int(&#039;&#039;.join(map(str, row)))&lt;br /&gt;
        min_number = min(min_number, number)&lt;br /&gt;
    return min_number&lt;br /&gt;
&lt;br /&gt;
def main():&lt;br /&gt;
    with open(&amp;quot;bloc.in&amp;quot;, &amp;quot;r&amp;quot;) as fin:&lt;br /&gt;
        K, P, N = map(int, fin.readline().split())&lt;br /&gt;
&lt;br /&gt;
    sequence = [i % K + 1 for i in range(K * 2)]&lt;br /&gt;
    block = [sequence[i:i+P] for i in range(0, P*(N+1), P)]&lt;br /&gt;
&lt;br /&gt;
    for _ in range(N):&lt;br /&gt;
        block = rotate_block(block, P)&lt;br /&gt;
&lt;br /&gt;
    sum_elements = sum_block(block)&lt;br /&gt;
    max_column = max_column_sum(block)&lt;br /&gt;
    min_line = min_line_number(block)&lt;br /&gt;
&lt;br /&gt;
    with open(&amp;quot;bloc.out&amp;quot;, &amp;quot;w&amp;quot;) as fout:&lt;br /&gt;
        fout.write(f&amp;quot;{sum_elements}\n&amp;quot;)&lt;br /&gt;
        fout.write(f&amp;quot;{max_column}\n&amp;quot;)&lt;br /&gt;
        fout.write(f&amp;quot;{min_line}\n&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
if __name__ == &amp;quot;__main__&amp;quot;:&lt;br /&gt;
    main()&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>RebecaBud</name></author>
	</entry>
	<entry>
		<id>https://wiki.universitas.ro/index.php?title=1499_-_Broscute&amp;diff=9989</id>
		<title>1499 - Broscute</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=1499_-_Broscute&amp;diff=9989"/>
		<updated>2024-06-03T16:16:49Z</updated>

		<summary type="html">&lt;p&gt;RebecaBud: Pagină nouă: == Enunt == Pe un lac cu apă termală se află n+1 frunze de nuferi. Pe n dintre ele stau la soare n broscuțe. Evident, o frunză este liberă și broscuţele au început să se joace. În fiecare moment o broscuță sare de pe frunza ei pe frunza liberă din acel moment. == Cerinţa == Numerotând frunzele de la 1 la n+1, broscuțele de la 1 la n, şi cunoscându-se ordinea inițială a broscuțelor pe cele n+1 frunze, să se determine numărul minim de sărituri ale brosc...&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Enunt ==&lt;br /&gt;
Pe un lac cu apă termală se află n+1 frunze de nuferi. Pe n dintre ele stau la soare n broscuțe. Evident, o frunză este liberă și broscuţele au început să se joace. În fiecare moment o broscuță sare de pe frunza ei pe frunza liberă din acel moment.&lt;br /&gt;
== Cerinţa ==&lt;br /&gt;
Numerotând frunzele de la 1 la n+1, broscuțele de la 1 la n, şi cunoscându-se ordinea inițială a broscuțelor pe cele n+1 frunze, să se determine numărul minim de sărituri ale broscuțelor de pe o frunză pe alta, astfel încât ele să se găsească într-o ordine finală, dată, precum şi săriturile realizate.&lt;br /&gt;
== Date de intrare ==&lt;br /&gt;
Fișierul de intrare &#039;&#039;&#039;broscute.in&#039;&#039;&#039; conține pe prima linie un număr natural n reprezentând numărul de broscuțe separat printr-un spațiu de un număr natural t, care reprezintă cerința: 1, dacă se cere numărul de sărituri, respectiv 2 dacă se cere ordinea săriturilor. Linia a doua conține n+1 numere naturale reprezentând configurația inițială a broscuțelor pe cele n+1 frunze, iar linia a treia conține n+1 numere naturale reprezentând configurația finală a broscuțelor pe cele n+1 frunze.&lt;br /&gt;
== Date de ieșire ==&lt;br /&gt;
Fișierul de ieșire &#039;&#039;&#039;broscute.out&#039;&#039;&#039; va conține pe prima linie un număr natural k ce reprezintă numărul minim de sărituri, dacă cerința este 1. Dacă cerința este 2 fișierul de ieșire va conține mai multe linii, pe fiecare dintre ele existând 3 numere naturale b s d, separate prin câte un spațiu, care descriu săritura, reprezentând numărul broscuței b, frunza de pe care sare s și frunza pe care sare d. În cazul în care la cerința 2 broscuțele nu fac nici o săritură se va afișa pe prima linie mesajul &#039;&#039;&#039;&#039;broscutele nu se joaca&#039;&#039;&#039;.&lt;br /&gt;
== Restricţii şi precizări ==&lt;br /&gt;
* &#039;&#039;&#039;2 ≤ n ≤ 1000&#039;&#039;&#039;&lt;br /&gt;
* În descrierea configurațiilor din fișierul de intrare frunza liberă este reprezentată prin valoarea 0&lt;br /&gt;
* Pentru cerința 1 se acordă 50% din punctaj, iar pentru cerința 2 tot 50% din punctaj.&lt;br /&gt;
* În cazul în care cerința este 2 și numărul de sărituri afișate nu este minim dar realizează ajungerea la configurația finală se acordă doar 30% din punctaj.&lt;br /&gt;
== Exemplul 1 ==&lt;br /&gt;
; broscute.in&lt;br /&gt;
&lt;br /&gt;
  4 2&lt;br /&gt;
  3 2 0 1 4&lt;br /&gt;
  1 2 3 4 0&lt;br /&gt;
; broscute.out&lt;br /&gt;
&lt;br /&gt;
  3 1 3&lt;br /&gt;
  1 4 1&lt;br /&gt;
  4 5 4&lt;br /&gt;
== Explicație ==&lt;br /&gt;
Sunt 4 broscuţe, deci 5 frunze de nufăr. Cerinţa este 2.&lt;br /&gt;
&lt;br /&gt;
* Broscuţele vor face 3 sărituri:&lt;br /&gt;
* broscuţa 3 sare de pe frunza 1 pe frunza 3&lt;br /&gt;
* broscuţa 1 sare de pe frunza 4 pe frunza 1&lt;br /&gt;
* broscuţa 4 sare de pe frunza 5 pe frunza 4&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Exemplul 2 ==&lt;br /&gt;
; broscute.in&lt;br /&gt;
&lt;br /&gt;
  4 1&lt;br /&gt;
  3 2 0 1 4&lt;br /&gt;
  1 2 3 4 0&lt;br /&gt;
; broscute.out&lt;br /&gt;
&lt;br /&gt;
  3&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Exemplul 3 ==&lt;br /&gt;
; broscute.in&lt;br /&gt;
&lt;br /&gt;
  4 2&lt;br /&gt;
  3 2 0 1 4&lt;br /&gt;
  3 2 0 1 4&lt;br /&gt;
; broscute.out&lt;br /&gt;
&lt;br /&gt;
  broscutele nu se joaca&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;gt;&lt;br /&gt;
def min_jumps_or_order(n, initial_config, final_config, request):&lt;br /&gt;
    if request == 1:&lt;br /&gt;
        return min_jumps(n, initial_config, final_config)&lt;br /&gt;
    elif request == 2:&lt;br /&gt;
        return min_jumps_order(n, initial_config, final_config)&lt;br /&gt;
&lt;br /&gt;
def min_jumps(n, initial_config, final_config):&lt;br /&gt;
    jumps = 0&lt;br /&gt;
    for i in range(n+1):&lt;br /&gt;
        if initial_config[i] != final_config[i]:&lt;br /&gt;
            jumps += 1&lt;br /&gt;
    return jumps&lt;br /&gt;
&lt;br /&gt;
def min_jumps_order(n, initial_config, final_config):&lt;br /&gt;
    jumps = []&lt;br /&gt;
    for i in range(n+1):&lt;br /&gt;
        if initial_config[i] != final_config[i]:&lt;br /&gt;
            for j in range(i+1, n+1):&lt;br /&gt;
                if final_config[i] == initial_config[j]:&lt;br /&gt;
                    jumps.append((j, initial_config.index(final_config[i]), i))&lt;br /&gt;
                    initial_config[j], initial_config[i] = initial_config[i], initial_config[j]&lt;br /&gt;
                    break&lt;br /&gt;
    if not jumps:&lt;br /&gt;
        return &amp;quot;broscutele nu se joaca&amp;quot;&lt;br /&gt;
    return jumps&lt;br /&gt;
&lt;br /&gt;
def main():&lt;br /&gt;
    with open(&amp;quot;broscute.in&amp;quot;, &amp;quot;r&amp;quot;) as fin:&lt;br /&gt;
        n, request = map(int, fin.readline().split())&lt;br /&gt;
        initial_config = list(map(int, fin.readline().split()))&lt;br /&gt;
        final_config = list(map(int, fin.readline().split()))&lt;br /&gt;
&lt;br /&gt;
    result = min_jumps_or_order(n, initial_config, final_config, request)&lt;br /&gt;
&lt;br /&gt;
    with open(&amp;quot;broscute.out&amp;quot;, &amp;quot;w&amp;quot;) as fout:&lt;br /&gt;
        if request == 1:&lt;br /&gt;
            fout.write(f&amp;quot;{result}\n&amp;quot;)&lt;br /&gt;
        elif request == 2:&lt;br /&gt;
            if isinstance(result, str):&lt;br /&gt;
                fout.write(result)&lt;br /&gt;
            else:&lt;br /&gt;
                fout.write(&#039;\n&#039;.join([&#039; &#039;.join(map(str, jump)) for jump in result]))&lt;br /&gt;
&lt;br /&gt;
if __name__ == &amp;quot;__main__&amp;quot;:&lt;br /&gt;
    main()&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>RebecaBud</name></author>
	</entry>
	<entry>
		<id>https://wiki.universitas.ro/index.php?title=0141_-_Compuneri&amp;diff=9986</id>
		<title>0141 - Compuneri</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=0141_-_Compuneri&amp;diff=9986"/>
		<updated>2024-06-03T16:12:32Z</updated>

		<summary type="html">&lt;p&gt;RebecaBud: Pagină nouă: == Enunt ==  După descoperirea vieţii pe planeta Marte, cercetătorii pământeni au început activitatea de studiere a fiinţelor vii marţiene. Prima constatare a fost că este o legătură strânsă între modul de formare a acestora şi numerele naturale. Astfel, unei specii i s-a asociat un număr natural mai mare decât 1. Mai mult, oricare două specii se pot compune, rezultând altă specie. Numărul asociat noii specii este dat de produsul numerelor asociate celor...&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Enunt ==&lt;br /&gt;
&lt;br /&gt;
După descoperirea vieţii pe planeta Marte, cercetătorii pământeni au început activitatea de studiere a fiinţelor vii marţiene. Prima constatare a fost că este o legătură strânsă între modul de formare a acestora şi numerele naturale. Astfel, unei specii i s-a asociat un număr natural mai mare decât 1. Mai mult, oricare două specii se pot compune, rezultând altă specie. Numărul asociat noii specii este dat de produsul numerelor asociate celor două specii care se compun. Astfel, modalitatea de obţinere a unei specii nu este unică (o specie ce are asociat numărul 12 se poate obţine compunând specia 2 cu specia 6, sau specia 3 cu specia 4). Evident, unele specii se pot obţine prin compunerea altora (ex. 12) dar unele nu se pot obţine prin compunere. Pe acestea din urmă le vom numi atomi (de exemplu specia ce are asociat codul 7 este atom, şi mai sunt şi altele). O specie se poate compune cu ea însăşi rezultând altă specie (de exemplu, prin compunerea speciei 3 cu ea însăşi se obţine specia 9). De asemenea, dacă specia X se poate obţine prin compunerea speciilor Y şi Z spunem că X are în compoziţie pe Y şi pe Z. Mai mulţi cercetători au recoltat probe obţinând astfel o listă de coduri ale speciilor pe care le-au observat.&lt;br /&gt;
== Cerinţa ==&lt;br /&gt;
Scrieţi un program care, pe baza codurilor din lista formată, să determine:&lt;br /&gt;
a) numărul de atomi din listă;&lt;br /&gt;
b) numărul de specii din listă care nu pot avea în compoziţie niciun atom dintre cei aflaţi în listă;&lt;br /&gt;
== Date de intrare ==&lt;br /&gt;
Fişierul compuneri.in conţine pe prima linie un număr natural N. Pe linia a doua se află N numere naturale separate prin câte un spaţiu. Acestea reprezintă codurile speciilor din listă.&lt;br /&gt;
== Date de ieșire ==&lt;br /&gt;
Fişierul compuneri.out va conţine pe prima linie două valori naturale separate printr-un spaţiu, ce reprezintă numerele din cerinţă: (primul număr va fi valoarea calculată pentru cerinţa a) ).&lt;br /&gt;
== Restricţii şi precizări ==&lt;br /&gt;
* 1 &amp;lt;= N &amp;lt;= 100000;&lt;br /&gt;
* 2 &amp;lt;= numerele din listă ≤ 100000;&lt;br /&gt;
* Numerele din listă se pot repeta iar la rezultat se va contoriza fiecare apariţie;&lt;br /&gt;
== Exemplul 1 ==&lt;br /&gt;
; compuneri.in&lt;br /&gt;
&lt;br /&gt;
  10&lt;br /&gt;
  7 7 121 11 3 29 32 3 1300 17&lt;br /&gt;
; compuneri.out&lt;br /&gt;
&lt;br /&gt;
  7 2&lt;br /&gt;
== Explicație ==&lt;br /&gt;
&lt;br /&gt;
În listă sunt 7 atomi: 7, 7, 11, 3, 29, 3, 17&lt;br /&gt;
&lt;br /&gt;
Dintre celelalte trei valori, 121 se formează prin compunerea atomului existent 11 cu el însuşi iar celelalte două nu se pot obţine prin compuneri ale atomilor existenţi.&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;gt;&lt;br /&gt;
def count_atoms_and_species(species_codes):&lt;br /&gt;
    atoms = set()&lt;br /&gt;
    for code in species_codes:&lt;br /&gt;
        factors = set()&lt;br /&gt;
        for i in range(2, int(code**0.5) + 1):&lt;br /&gt;
            if code % i == 0:&lt;br /&gt;
                factors.add(i)&lt;br /&gt;
                factors.add(code // i)&lt;br /&gt;
        if len(factors) == 0:&lt;br /&gt;
            atoms.add(code)&lt;br /&gt;
    return len(atoms), len(species_codes) - len(atoms)&lt;br /&gt;
&lt;br /&gt;
def main():&lt;br /&gt;
    with open(&amp;quot;compuneri.in&amp;quot;, &amp;quot;r&amp;quot;) as fin:&lt;br /&gt;
        N = int(fin.readline().strip())&lt;br /&gt;
        species_codes = list(map(int, fin.readline().split()))&lt;br /&gt;
&lt;br /&gt;
    atom_count, species_count = count_atoms_and_species(species_codes)&lt;br /&gt;
&lt;br /&gt;
    with open(&amp;quot;compuneri.out&amp;quot;, &amp;quot;w&amp;quot;) as fout:&lt;br /&gt;
        fout.write(f&amp;quot;{atom_count} {species_count}&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
if __name__ == &amp;quot;__main__&amp;quot;:&lt;br /&gt;
    main()&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>RebecaBud</name></author>
	</entry>
	<entry>
		<id>https://wiki.universitas.ro/index.php?title=1086_-_Submit&amp;diff=9983</id>
		<title>1086 - Submit</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=1086_-_Submit&amp;diff=9983"/>
		<updated>2024-06-03T16:08:32Z</updated>

		<summary type="html">&lt;p&gt;RebecaBud: Pagină nouă: == Enunt == Vasilică se antrenează pe un site de probleme cu evaluare online. Când el trimite pe site soluţia la o problemă, aceasta este evaluată pe un anumit număr de teste. Punctajul obţinut la problema respectivă va fi egal cu suma punctajelor obţinute la fiecare test. Punctajele asociate testelor pot fi diferite. În plus, dacă problema a fost complet rezolvată (a obţinut punctaj maxim la toate testele), Vasilică primeşte şi un bonus.  Vasilică poate tri...&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Enunt ==&lt;br /&gt;
Vasilică se antrenează pe un site de probleme cu evaluare online. Când el trimite pe site soluţia la o problemă, aceasta este evaluată pe un anumit număr de teste. Punctajul obţinut la problema respectivă va fi egal cu suma punctajelor obţinute la fiecare test. Punctajele asociate testelor pot fi diferite. În plus, dacă problema a fost complet rezolvată (a obţinut punctaj maxim la toate testele), Vasilică primeşte şi un bonus.&lt;br /&gt;
&lt;br /&gt;
Vasilică poate trimite soluţia la o problemă de mai multe ori. Când trimite soluţia prima dată, punctajul se calculează în modul prezentat anterior. Când trimite soluţia a doua oară, Vasilică va fi penalizat cu două puncte (adică din punctajul total obţinut la problemă se scad două puncte). Când trimite soluţia a treia oară penalizarea este de 4 puncte, a patra oară de 6 puncte ş.a.m.d. Observaţi că la fiecare nouă încercare penalizarea creşte cu două puncte.&lt;br /&gt;
== Cerinţa ==&lt;br /&gt;
Date fiind rezultatele obţinute pe teste de Vasilică la fiecare soluţie trimisă, să se determine punctajul maxim pe care el l-a obţinut la problema respectivă.&lt;br /&gt;
== Date de intrare ==&lt;br /&gt;
Fișierul de intrare &#039;&#039;&#039;submit.in&#039;&#039;&#039; conține pe prima linie numărul natural N reprezentând numărul de teste pe care este evaluată soluţia. Pe cea de a doua linie se află N numere naturale separate prin spaţii P1 P2 … PN, reprezentând în ordine punctajul acordat pentru fiecare dintre cele N teste. Pe cea de a treia linie se află numărul natural B reprezentând bonusul (numărul de puncte acordate în cazul în care pentru toate testele soluţia obţine punctaj pe toate testele). Pe a patra linie este scris un număr natural M reprezentând numărul de soluţii trimise de Vasilică la problemă. Urmează M linii, fiecare linie conţinând rezultatele obţinute pe teste la cele M soluţii trimise de Vasilică, în ordinea trimiterii lor. Pe cea de a i-a linie (1≤i≤M) dintre cele M sunt scrise N valori din mulţimea {0, 1}, separate prin spaţii; a j-a valoare (1≤j≤N) este 0 dacă testul j nu a fost rezolvat corect, respectiv 1 dacă testul j a fost corect rezolvat (obţinând punctajul maxim alocat pe test).&lt;br /&gt;
== Date de ieșire ==&lt;br /&gt;
Fișierul de ieșire &#039;&#039;&#039;submit.out&#039;&#039;&#039; va conţine o singură linie pe care va fi scris punctajul maxim obţinut de Vasilică la problema respectivă.&lt;br /&gt;
== Restricţii şi precizări ==&lt;br /&gt;
* &#039;&#039;&#039;1 ≤ N, M ≤ 100&#039;&#039;&#039;&lt;br /&gt;
* &#039;&#039;&#039;0 ≤ Pi ≤ 100&#039;&#039;&#039;, pentru orice 1 ≤ i ≤ N&lt;br /&gt;
* &#039;&#039;&#039;0 ≤ B ≤ 100&#039;&#039;&#039;&lt;br /&gt;
== Exemplul 1 ==&lt;br /&gt;
; submit.in&lt;br /&gt;
&lt;br /&gt;
  4&lt;br /&gt;
  10 5 5 20&lt;br /&gt;
  13&lt;br /&gt;
  3&lt;br /&gt;
  0 0 0 0&lt;br /&gt;
  1 1 1 1&lt;br /&gt;
  0 1 0 1&lt;br /&gt;
; submit.out&lt;br /&gt;
&lt;br /&gt;
  51&lt;br /&gt;
== Explicație== &lt;br /&gt;
&lt;br /&gt;
Problema este evaluată pe 4 teste. Punctajele acordate pe teste sunt 10, 5, 5 şi respectiv 20. În cazul în care toate testele sunt rezolvate corect, se acordă 13 puncte bonus.&lt;br /&gt;
&lt;br /&gt;
La această problemă Vasilică trimite 3 surse.&lt;br /&gt;
&lt;br /&gt;
Prima sursă trimisă nu rezolvă corect niciun test, deci obţine 0 puncte.&lt;br /&gt;
&lt;br /&gt;
A doua sursă trimisă rezolvă corect toate testele, primind 10+5+5+20=40 puncte pe teste, la care se adaugă 13 puncte bonus; dar fiind a doua soluţie trimisă se aplică o penalizare de două puncte. În total 40+13-2=51 puncte.&lt;br /&gt;
&lt;br /&gt;
A treia sursă trimisă rezolvă numai teste 2 şi 4 deci obţine 5+20=25 puncte şi este penalizată cu 4 puncte, deci punctajul total este 21.&lt;br /&gt;
&lt;br /&gt;
Punctajul maxim obţinut de Vasilică este prin urmare 51.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&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;gt;&lt;br /&gt;
def max_score(N, points, bonus, M, solutions):&lt;br /&gt;
    max_score = 0&lt;br /&gt;
    penalty = 0&lt;br /&gt;
&lt;br /&gt;
    for i in range(M):&lt;br /&gt;
        correct_tests = sum(solutions[i])&lt;br /&gt;
        score = sum(points[j] for j in range(N) if solutions[i][j] == 1)&lt;br /&gt;
        score += bonus if correct_tests == N else 0&lt;br /&gt;
        score -= penalty&lt;br /&gt;
        max_score = max(max_score, score)&lt;br /&gt;
        penalty += 2&lt;br /&gt;
&lt;br /&gt;
    return max_score&lt;br /&gt;
&lt;br /&gt;
def main():&lt;br /&gt;
    with open(&amp;quot;submit.in&amp;quot;, &amp;quot;r&amp;quot;) as fin:&lt;br /&gt;
        N = int(fin.readline().strip())&lt;br /&gt;
        points = list(map(int, fin.readline().split()))&lt;br /&gt;
        bonus = int(fin.readline().strip())&lt;br /&gt;
        M = int(fin.readline().strip())&lt;br /&gt;
        solutions = [list(map(int, fin.readline().split())) for _ in range(M)]&lt;br /&gt;
&lt;br /&gt;
    max_score_value = max_score(N, points, bonus, M, solutions)&lt;br /&gt;
&lt;br /&gt;
    with open(&amp;quot;submit.out&amp;quot;, &amp;quot;w&amp;quot;) as fout:&lt;br /&gt;
        fout.write(str(max_score_value))&lt;br /&gt;
&lt;br /&gt;
if __name__ == &amp;quot;__main__&amp;quot;:&lt;br /&gt;
    main()&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>RebecaBud</name></author>
	</entry>
	<entry>
		<id>https://wiki.universitas.ro/index.php?title=1213_-_Iepuras&amp;diff=9981</id>
		<title>1213 - Iepuras</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=1213_-_Iepuras&amp;diff=9981"/>
		<updated>2024-06-03T16:04:38Z</updated>

		<summary type="html">&lt;p&gt;RebecaBud: Pagină nouă: == Enunt ==  Iepurașul Coconaș vrea să ajungă la grădina cu morcovi. Pentru aceasta el trebuie să traverseze prin salturi o zonă cu proprietăți speciale. Zona este formată din N căsuțe numerotate de la 1 la N, dispuse una după cealaltă, iar fiecare căsuță conține un număr natural ce reprezintă cantitatea de energie necesară iepurașului pentru a sări într-o altă căsuță.  Iepurașul pleacă dintr-o anumită căsuță și se deplasează, de la stânga...&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Enunt ==&lt;br /&gt;
&lt;br /&gt;
Iepurașul Coconaș vrea să ajungă la grădina cu morcovi. Pentru aceasta el trebuie să traverseze prin salturi o zonă cu proprietăți speciale. Zona este formată din N căsuțe numerotate de la 1 la N, dispuse una după cealaltă, iar fiecare căsuță conține un număr natural ce reprezintă cantitatea de energie necesară iepurașului pentru a sări într-o altă căsuță.&lt;br /&gt;
&lt;br /&gt;
Iepurașul pleacă dintr-o anumită căsuță și se deplasează, de la stânga la dreapta, spre grădina cu morcovi după următoarele reguli:&lt;br /&gt;
&lt;br /&gt;
* numărul înscris în căsuța în care se află iepurașul reprezintă numărul de căsuțe peste care el va sări;&lt;br /&gt;
dacă numărul înscris în căsuța în care se află iepurașul este număr prim, atunci energia lui se dublează şi va sări peste un număr dublu de căsuţe;&lt;br /&gt;
numărarea căsuțelor peste care va sări se face de la stânga la dreapta și începe cu căsuța imediat următoare. &lt;br /&gt;
* Astfel, dacă iepurașul se află în căsuța a treia și numărul înscris în această căsuță este 5, iepurașul va ajunge în căsuța cu numărul de ordine 13 (13=3+2*5).&lt;br /&gt;
dacă iepurașul ajunge într-o căsuță care conține numărul 0, el rămâne acolo pentru că nu mai are energie să sară mai departe, altfel el continuă să sară după regulile descrise mai sus;&lt;br /&gt;
iepurașul ajunge la grădina cu morcovi dacă ultimul salt pe care îl face depășește căsuța N.&lt;br /&gt;
== Cerinţa ==&lt;br /&gt;
Scrieți un program care citește trei numere naturale P, N și K iar apoi N numere naturale și determină:&lt;br /&gt;
&lt;br /&gt;
1) dacă iepurașul poate ajunge sau nu, la grădina cu morcovi pornind din căsuța K și numărul de salturi pe care le face iepurașul pornind din căsuța K;&lt;br /&gt;
2) căsuța de pornire a iepurașului, astfel încât drumul parcurs de el să traverseze un număr maxim de căsuțe. Pentru a determina numărul de căsuțe se vor lua în calcul: căsuța de pornire, toate căsuțele peste care iepurașul a sărit și toate căsuțele în care a ajuns în urma salturilor. Iepurașul poate porni din oricare căsuță. În cazul în care există două sau mai multe căsuțe de pornire care conduc la același număr maxim de căsuțe traversate se va lua în considerare căsuța cu numărul de ordine cel mai mic.&lt;br /&gt;
== Date de intrare ==&lt;br /&gt;
Fişierul de intrare &#039;&#039;&#039;iepuras.in&#039;&#039;&#039; conţine pe prima linie un număr natural P. Pentru toate testele de intrare, numărul P poate avea doar valoarea 1 sau valoarea 2. Pe a doua linie a fișierului &#039;&#039;&#039;iepuras.in&#039;&#039;&#039; se găsesc, în această ordine, numerele naturale N și K, separate prin câte un spațiu. Pe a treia linie se găsesc N numere naturale separate prin câte un spațiu, reprezentând valorile din fiecare căsuță în ordine de la 1 la N.&lt;br /&gt;
== Date de ieșire ==&lt;br /&gt;
Dacă valoarea lui P este 1, se va rezolva numai punctul 1) din cerințe. În acest caz, fişierul de ieşire iepuras.out va conține pe prima linie cuvântul DA în cazul în care iepurașul a ajuns în grădina cu morcovi , respectiv cuvântul NU în caz contrar, iar pe a doua linie va conține un număr natural reprezentând numărul de salturi pe care le face iepurașul pornind din căsuța K.&lt;br /&gt;
&lt;br /&gt;
Dacă valoarea lui P este 2, se va rezolva numai punctul 2) din cerințe. În acest caz, fişierul de ieşire iepuras.out va conține pe prima linie două numere naturale separate printr-un spaţiu reprezentând, în ordine, căsuța de pornire și numărul maxim de căsuțe determinat, iar pe a doua linie, un șir de numere naturale separate prin câte un spațiu reprezentând numerele din căsuțele în care iepurașul nu s-a aflat sau nu a sărit pe parcursul drumului, de la stânga la dreapta, începând cu căsuța 1. Dacă numărul maxim de căsuțe traversate este chiar N linia a doua nu va conține niciun număr.&lt;br /&gt;
== Restricţii şi precizări ==&lt;br /&gt;
* &#039;&#039;&#039;1 ≤ N ≤ 7000&#039;&#039;&#039;&lt;br /&gt;
* &#039;&#039;&#039;1 ≤ K ≤ N&#039;&#039;&#039;&lt;br /&gt;
* 0 ≤ numerele conţinute în căsuţe ≤ 100&lt;br /&gt;
* Pentru rezolvarea corectă a primei cerinţe se acordă 30 de puncte, pentru rezolvarea corectă a celei de a doua cerințe se acordă 70 de puncte.&lt;br /&gt;
== Exemplul 1 ==&lt;br /&gt;
; iepuras.in&lt;br /&gt;
&lt;br /&gt;
  1&lt;br /&gt;
  14 3&lt;br /&gt;
  2 3 4 0 1 1 2 1 4 0 0 2 1 1&lt;br /&gt;
; iepuras.out&lt;br /&gt;
&lt;br /&gt;
  NU&lt;br /&gt;
  2&lt;br /&gt;
== Explicație ==&lt;br /&gt;
* P = 1, pentru acest test, se rezolva cerința 1).&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Exemplul 2 ==&lt;br /&gt;
; iepuras.in&lt;br /&gt;
&lt;br /&gt;
  2&lt;br /&gt;
  14 3&lt;br /&gt;
  2 3 6 0 1 1 2 1 4 0 0 2 3 1&lt;br /&gt;
; iepuras.out&lt;br /&gt;
&lt;br /&gt;
  2 13&lt;br /&gt;
  2 6 0 1 1 2 0 0 2 1&lt;br /&gt;
== Explicație  ==&lt;br /&gt;
* P = 2, pentru acest test, se rezolvă cerința 2).&lt;br /&gt;
&lt;br /&gt;
Pentru a traversa un număr maxim de căsuțe, iepurașul pleacă din căsuța cu numărul de ordine 2 și sare, pe rând, în căsuțele cu numerele de ordine 8, 9, 13, și apoi în grădină, traversând astfel 13 căsuţe (de la căsuța 2 la căsuța 14).&lt;br /&gt;
&lt;br /&gt;
Iepurașul nu s-a aflat sau nu a sărit în căsuţele de pe poziţiile 1, 3, 4, 5, 6, 7, 10, 11, 12 și 14.&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;gt;&lt;br /&gt;
def can_reach_garden(N, K, houses):&lt;br /&gt;
    energy = houses[K - 1]&lt;br /&gt;
    jumps = 0&lt;br /&gt;
&lt;br /&gt;
    while K &amp;lt;= N:&lt;br /&gt;
        jumps += 1&lt;br /&gt;
        K += energy&lt;br /&gt;
        if K &amp;gt; N:&lt;br /&gt;
            return True, jumps&lt;br /&gt;
        energy = houses[K - 1] if houses[K - 1] &amp;gt; 1 else energy * 2&lt;br /&gt;
&lt;br /&gt;
    return False, jumps&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def find_starting_house(N, houses):&lt;br /&gt;
    max_houses = 0&lt;br /&gt;
    starting_house = 0&lt;br /&gt;
&lt;br /&gt;
    for i in range(1, N + 1):&lt;br /&gt;
        energy = houses[i - 1]&lt;br /&gt;
        jumps = 1&lt;br /&gt;
        current_house = i&lt;br /&gt;
&lt;br /&gt;
        while current_house + energy &amp;lt;= N:&lt;br /&gt;
            jumps += 1&lt;br /&gt;
            current_house += energy&lt;br /&gt;
            energy = houses[current_house - 1] if houses[current_house - 1] &amp;gt; 1 else energy * 2&lt;br /&gt;
&lt;br /&gt;
        if jumps &amp;gt; max_houses:&lt;br /&gt;
            max_houses = jumps&lt;br /&gt;
            starting_house = i&lt;br /&gt;
&lt;br /&gt;
    return starting_house, max_houses&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def main():&lt;br /&gt;
    with open(&amp;quot;iepuras.in&amp;quot;, &amp;quot;r&amp;quot;) as fin:&lt;br /&gt;
        P = int(fin.readline().strip())&lt;br /&gt;
        N, K = map(int, fin.readline().split())&lt;br /&gt;
        houses = list(map(int, fin.readline().split()))&lt;br /&gt;
&lt;br /&gt;
    if P == 1:&lt;br /&gt;
        can_reach, jumps = can_reach_garden(N, K, houses)&lt;br /&gt;
        with open(&amp;quot;iepuras.out&amp;quot;, &amp;quot;w&amp;quot;) as fout:&lt;br /&gt;
            fout.write(&amp;quot;DA\n&amp;quot; if can_reach else &amp;quot;NU\n&amp;quot;)&lt;br /&gt;
            fout.write(str(jumps))&lt;br /&gt;
    elif P == 2:&lt;br /&gt;
        starting_house, max_houses = find_starting_house(N, houses)&lt;br /&gt;
        not_visited_houses = [i for i in range(1, N + 1) if i != starting_house]&lt;br /&gt;
&lt;br /&gt;
        with open(&amp;quot;iepuras.out&amp;quot;, &amp;quot;w&amp;quot;) as fout:&lt;br /&gt;
            fout.write(f&amp;quot;{starting_house} {max_houses}\n&amp;quot;)&lt;br /&gt;
            fout.write(&amp;quot; &amp;quot;.join(map(str, not_visited_houses)))&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;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>RebecaBud</name></author>
	</entry>
	<entry>
		<id>https://wiki.universitas.ro/index.php?title=1739_-_Proiecte_1&amp;diff=9978</id>
		<title>1739 - Proiecte 1</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=1739_-_Proiecte_1&amp;diff=9978"/>
		<updated>2024-06-03T16:00:14Z</updated>

		<summary type="html">&lt;p&gt;RebecaBud: Pagină nouă: == Enunt == În oraşul Iaşi, cele N firme IT derulează în prezent M proiecte din acest domeniu (printre care şi ONI 2012). Firmele sunt identificate prin numere naturale de la 1 la N, iar proiectele sunt identificate prin numere naturale de la 1 la M. Fiecare proiect are una sau mai multe etape, o etapă fiind executată de o singură firmă IT. Spunem că o firmă coordonează un proiect dacă execută mai mult de jumătate din etapele proiectului. == Cerinţa == Cunosc...&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Enunt ==&lt;br /&gt;
În oraşul Iaşi, cele N firme IT derulează în prezent M proiecte din acest domeniu (printre care şi ONI 2012). Firmele sunt identificate prin numere naturale de la 1 la N, iar proiectele sunt identificate prin numere naturale de la 1 la M. Fiecare proiect are una sau mai multe etape, o etapă fiind executată de o singură firmă IT. Spunem că o firmă coordonează un proiect dacă execută mai mult de jumătate din etapele proiectului.&lt;br /&gt;
== Cerinţa ==&lt;br /&gt;
Cunoscând numărul firmelor IT, numărul proiectelor, numărul de etape ale fiecărui proiect şi firmele ce execută fiecare etapă, să se determine firma/firmele care coordonează cel mai mare număr de proiecte.&lt;br /&gt;
== Date de intrare ==&lt;br /&gt;
Fişierul de intrare &#039;&#039;&#039;proiecte.in&#039;&#039;&#039; conţine, pe prima linie, numerele naturale N şi M, separate printr-un spaţiu, cu semnificaţia de mai sus. Pe fiecare dintre următoarele M linii se află informaţii despre câte un proiect, în ordinea numerelor de identificare a acestora. Astfel, pe linia corespunzătoare proiectului i (1≤i≤M), se află un număr natural nri, urmat de nri numere naturale f1f2…fnri&lt;br /&gt;
, reprezentând numărul de etape ale acestui proiect, respectiv firmele care execută fiecare etapă din proiect (firma fk&lt;br /&gt;
 execută etapa k, 1≤k≤nri). Numerele de pe aceeaşi linie sunt separate prin câte un spaţiu.&lt;br /&gt;
== Date de ieșire ==&lt;br /&gt;
Fişierul de ieşire &#039;&#039;&#039;proiecte.out&#039;&#039;&#039; va conţine o singură linie, pe care va fi scris numărul de identificare al firmei/firmelor care coordonează cel mai mare număr de proiecte. Dacă sunt mai multe astfel de firme, numerele de identificare ale acestora se vor afişa pe aceeaşi linie, în ordine crescătoare, separate prin câte un spaţiu.&lt;br /&gt;
== Restricţii şi precizări ==&lt;br /&gt;
* 1 ≤ M ≤ 200&lt;br /&gt;
* 1 ≤ N ≤ 1000000&lt;br /&gt;
* 1 ≤ nri ≤ 200000 (1≤i≤M)&lt;br /&gt;
* 1 ≤ M*nri ≤ 320000 (1≤i≤M)&lt;br /&gt;
* 1 ≤ fk≤ N, (1≤k≤nri)&lt;br /&gt;
* există întotdeauna cel puţin un proiect coordonat de o firmă.&lt;br /&gt;
== Exemplul 1 ==&lt;br /&gt;
; proiecte.in&lt;br /&gt;
&lt;br /&gt;
  5 4&lt;br /&gt;
  2 3 3&lt;br /&gt;
  3 1 2 1&lt;br /&gt;
  5 3 4 3 3 1&lt;br /&gt;
  1 1&lt;br /&gt;
; proiecte.out&lt;br /&gt;
&lt;br /&gt;
  1 3&lt;br /&gt;
== Explicație ==&lt;br /&gt;
Numărul maxim de proiecte coordonate de aceeaşi firmă este 2: firma 1 coordonează proiectele 2 şi 4, iar firma 3 coordonează proiectele 1 şi 3.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&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;gt;&lt;br /&gt;
def main():&lt;br /&gt;
    with open(&amp;quot;proiecte.in&amp;quot;, &amp;quot;r&amp;quot;) as fin:&lt;br /&gt;
        N, M = map(int, fin.readline().split())&lt;br /&gt;
        projects = [list(map(int, fin.readline().split()))[1:] for _ in range(M)]&lt;br /&gt;
&lt;br /&gt;
    project_count = {i: 0 for i in range(1, N + 1)}&lt;br /&gt;
&lt;br /&gt;
    for project in projects:&lt;br /&gt;
        firms_count = {f: 0 for f in project}&lt;br /&gt;
        for firm in project:&lt;br /&gt;
            firms_count[firm] += 1&lt;br /&gt;
        max_count = max(firms_count.values())&lt;br /&gt;
        for firm, count in firms_count.items():&lt;br /&gt;
            if count &amp;gt; len(project) / 2:&lt;br /&gt;
                project_count[firm] += 1&lt;br /&gt;
&lt;br /&gt;
    max_projects = max(project_count.values())&lt;br /&gt;
    coordinating_firms = [firm for firm, count in project_count.items() if count == max_projects]&lt;br /&gt;
&lt;br /&gt;
    with open(&amp;quot;proiecte.out&amp;quot;, &amp;quot;w&amp;quot;) as fout:&lt;br /&gt;
        fout.write(&amp;quot; &amp;quot;.join(map(str, coordinating_firms)))&lt;br /&gt;
&lt;br /&gt;
if __name__ == &amp;quot;__main__&amp;quot;:&lt;br /&gt;
    main()&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>RebecaBud</name></author>
	</entry>
	<entry>
		<id>https://wiki.universitas.ro/index.php?title=3566_-_Templu&amp;diff=9976</id>
		<title>3566 - Templu</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=3566_-_Templu&amp;diff=9976"/>
		<updated>2024-06-03T15:56:35Z</updated>

		<summary type="html">&lt;p&gt;RebecaBud: Pagină nouă: == Cerinţa == Copa ajunse în Orintia unde există un templu cu mai multe nivele, baza fiind un pătrat de lungime L. Primul nivel are înălţimea egală cu N, iar celelalte nivele au înălţimea mai mare cu o unitate faţă de cel anterior. Spre exemplu pentru L = 5 şi N = 3 din stâncă răsări templul (imagine din avion şi de la sol):  3  3  3  3  3 3  4  4  4  3 3  4  5  4  3 3  4  4  4  3 3  3  3  3  3         5     4 4 4   3 3 3 3 3 Copa deschise un document vechi...&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Cerinţa ==&lt;br /&gt;
Copa ajunse în Orintia unde există un templu cu mai multe nivele, baza fiind un pătrat de lungime L. Primul nivel are înălţimea egală cu N, iar celelalte nivele au înălţimea mai mare cu o unitate faţă de cel anterior. Spre exemplu pentru L = 5 şi N = 3 din stâncă răsări templul (imagine din avion şi de la sol):&lt;br /&gt;
&lt;br /&gt;
3  3  3  3  3&lt;br /&gt;
3  4  4  4  3&lt;br /&gt;
3  4  5  4  3&lt;br /&gt;
3  4  4  4  3&lt;br /&gt;
3  3  3  3  3&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
      5&lt;br /&gt;
    4 4 4&lt;br /&gt;
  3 3 3 3 3&lt;br /&gt;
Copa deschise un document vechi şi citi: „Ca să afli cât aur este în templu, trebuie să însumezi numărul de metri de pe fiecare orizontală…”. Şi Copa socoti: 3 + 3 + 3 + 3 + 3 = 15 ; 3 + 4 + 4 + 4 + 3 = 18 ; 3 + 4 + 5 + 4 + 3 = 19 ; celelalte 18 şi 15. „Apoi, trebuie să afli suma numerelor obţinute…”. Iar Copa îşi notă numărul 85. „Toate numerele obţinute se lipesc pentru a forma cel mai mic număr posibil…”. Şi Copa obţinu numărul: 151518181985 . „Din numărul acesta se caută cel mai mare număr de două cifre alăturate. Aceasta este cantitatea de aur din templu.”. Şi Copa ţipă de bucurie: 98!.&lt;br /&gt;
&lt;br /&gt;
Plecaţi în Orintia! Veţi primi cele două numere N şi L şi vi se cere să determinaţi numărul obţinut din sume şi cantitatea de aur.&lt;br /&gt;
== Date de intrare ==&lt;br /&gt;
Fişierul de intrare &#039;&#039;&#039;templu.in&#039;&#039;&#039; conţine pe prima linie numerele N şi L separate printr-un spaţiu.&lt;br /&gt;
== Date de ieșire ==&lt;br /&gt;
Fişierul de iesire &#039;&#039;&#039;templu.out&#039;&#039;&#039; va conţine două linii. Pe câte o linie se va scrie câte un număr. Pe prima linie numărul obţinut din sume, iar pe a doua linie cantitatea de aur.&lt;br /&gt;
== Restricţii şi precizări ==&lt;br /&gt;
* 2≤L≤10&lt;br /&gt;
* 1≤N≤50&lt;br /&gt;
== Exemplul 1 ==&lt;br /&gt;
; templu.in&lt;br /&gt;
&lt;br /&gt;
  3 5&lt;br /&gt;
; templu.out&lt;br /&gt;
&lt;br /&gt;
  151518181985&lt;br /&gt;
  98&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&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;gt;&lt;br /&gt;
def calculate_gold_quantity(N, L):&lt;br /&gt;
    total_sum = 0&lt;br /&gt;
    gold_number = &amp;quot;&amp;quot;&lt;br /&gt;
    &lt;br /&gt;
    for i in range(N):&lt;br /&gt;
        level_sum = 0&lt;br /&gt;
        for j in range(L):&lt;br /&gt;
            level_sum += N + j&lt;br /&gt;
            gold_number += str(N + j)&lt;br /&gt;
        total_sum += level_sum&lt;br /&gt;
    &lt;br /&gt;
    gold_quantity = max(int(gold_number[i:i+2]) for i in range(len(gold_number) - 1))&lt;br /&gt;
    &lt;br /&gt;
    return total_sum, gold_quantity&lt;br /&gt;
&lt;br /&gt;
def main():&lt;br /&gt;
    with open(&amp;quot;templu.in&amp;quot;, &amp;quot;r&amp;quot;) as fin:&lt;br /&gt;
        N, L = map(int, fin.readline().split())&lt;br /&gt;
    &lt;br /&gt;
    total_sum, gold_quantity = calculate_gold_quantity(N, L)&lt;br /&gt;
    &lt;br /&gt;
    with open(&amp;quot;templu.out&amp;quot;, &amp;quot;w&amp;quot;) as fout:&lt;br /&gt;
        fout.write(str(total_sum) + &amp;quot;\n&amp;quot;)&lt;br /&gt;
        fout.write(str(gold_quantity))&lt;br /&gt;
&lt;br /&gt;
if __name__ == &amp;quot;__main__&amp;quot;:&lt;br /&gt;
    main()&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>RebecaBud</name></author>
	</entry>
	<entry>
		<id>https://wiki.universitas.ro/index.php?title=3845_-_Ciurulet&amp;diff=9974</id>
		<title>3845 - Ciurulet</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=3845_-_Ciurulet&amp;diff=9974"/>
		<updated>2024-06-03T15:52:41Z</updated>

		<summary type="html">&lt;p&gt;RebecaBud: Pagină nouă: == Cerinţa == Popel, elev de liceu calificat la barajul pentru Lotul Național de Informatică, tocmai a învățat ciurul lui Eratostene, pentru aflarea numerelor prime, al cărui algoritm este descris astfel:    prim[i]=1, oricare ar fi i de la 2 la N   pentru i de la 2 la N:       dacă prim[i] este 1:           pentru j de la 2*i la N din i în i:               prim[j] = 0 Din cauza oboselii și a stresului, Popel a inițializat greșit șirul prim, punând pe unele pozi...&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Cerinţa ==&lt;br /&gt;
Popel, elev de liceu calificat la barajul pentru Lotul Național de Informatică, tocmai a învățat ciurul lui Eratostene, pentru aflarea numerelor prime, al cărui algoritm este descris astfel:&lt;br /&gt;
&lt;br /&gt;
  prim[i]=1, oricare ar fi i de la 2 la N&lt;br /&gt;
  pentru i de la 2 la N:&lt;br /&gt;
      dacă prim[i] este 1:&lt;br /&gt;
          pentru j de la 2*i la N din i în i:&lt;br /&gt;
              prim[j] = 0&lt;br /&gt;
Din cauza oboselii și a stresului, Popel a inițializat greșit șirul prim, punând pe unele poziții 0 în loc de 1. După ce a executat algoritmul pe șirul prim greșit inițializat, a obținut un nou șir pe care l-a notat pe o foaie de hârtie. Mai târziu, nu își mai amintea șirul inițial prim, dar mai avea șirul final pe care l-a obținut. În plus, nu mai era sigur dacă unele valori din șirul final le-a notat corect, așa că le-a marcat cu caracterul &amp;quot;?&amp;quot;. Popel vă roagă să aflați un șir inițial cu proprietatea că dacă ar executa algoritmul de mai sus asupra lui, ar obține un șir care s-ar potrivi cu șirul final notat pe foaie. De asemenea, el își dorește ca șirul inițial să aibă un număr cât mai mare de cifre de 1.&lt;br /&gt;
== Date de intrare ==&lt;br /&gt;
Pe prima linie a fișierului ciurulet.in se va afla numărul N reprezentând valoarea până la care se&lt;br /&gt;
execută algoritmul.&lt;br /&gt;
Următoarea linie conține N-1 caractere din mulțimea {0, 1, ?}, fără spații între ele, reprezentând șirul notat pe foaie. Caracterul ? indică un caracter pe care Popel nu și-l mai amintește (adică Popel nu mai știe dacă acolo era 0 sau 1). Al i-lea caracter dintre acestea reprezintă valoarea lui prim[i+1]. Dacă aceasta este diferită de ?, atunci Popel și-o amintește exact. Altfel, acolo ar fi putut fi orice (0 sau 1).&lt;br /&gt;
== Date de ieșire ==&lt;br /&gt;
Pe prima linie a fișierului ciurulet.out se va afla numărul maxim de cifre de 1 care pot apărea într-un șir&lt;br /&gt;
inițial din care se obține un șir final care se potrivește cu cel notat pe foaie.&lt;br /&gt;
Pe a doua linie se vor afișa N-1 caractere din mulțimea {0, 1}, fără spații între ele, care reprezintă șirul inițial folosit.&lt;br /&gt;
== Restricţii şi precizări ==&lt;br /&gt;
* &#039;&#039;&#039;2 ≤ N ≤ 1.000.000.&#039;&#039;&#039;&lt;br /&gt;
* Pentru 30% din teste, șirul din fișierul de intrare nu conține caracterul ?.&lt;br /&gt;
* Pentru ca două șiruri A și B să se potrivească, trebuie ca A[i] și B[i] să fie egale, oricare ar fi i de la 2 la N cu B[i] diferit de ?. Cu alte cuvinte, peste 0 se potrivește 0, peste 1 se potrivește 1, iar peste ? se potrivesc atât 0, cât și 1.&lt;br /&gt;
* Se garantează faptul că șirul final obținut notat pe foaie este unul valid.&lt;br /&gt;
== Exemplu 1 ==&lt;br /&gt;
; ciurulet.in&lt;br /&gt;
&lt;br /&gt;
  9&lt;br /&gt;
  ??10?00?&lt;br /&gt;
;ciurulet.out&lt;br /&gt;
&lt;br /&gt;
  5&lt;br /&gt;
  01101011&lt;br /&gt;
== Explicație ==&lt;br /&gt;
Aplicând algoritmul de mai sus asupra șirului 01101011 se obține în final șirul &#039;&#039;&#039;01100000&#039;&#039;&#039;, care se potrivește cu ce și-a notat Popel pe foaie.&lt;br /&gt;
== Exemplul 2 ==&lt;br /&gt;
; ciurulet.in&lt;br /&gt;
&lt;br /&gt;
  9&lt;br /&gt;
  ??10?00?&lt;br /&gt;
; ciurulet.out&lt;br /&gt;
&lt;br /&gt;
  5&lt;br /&gt;
  01101011&lt;br /&gt;
== Explicație ==&lt;br /&gt;
Aplicând algoritmul de mai sus asupra șirului 01101011 se obține în final șirul &#039;&#039;&#039;01100000&#039;&#039;&#039;, care se potrivește cu ce și-a notat Popel pe foaie.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&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;gt;&lt;br /&gt;
def find_max_ones(N, sequence):&lt;br /&gt;
    max_ones = 0&lt;br /&gt;
    max_ones_index = 0&lt;br /&gt;
    current_ones = 0&lt;br /&gt;
    current_index = 0&lt;br /&gt;
    &lt;br /&gt;
    for i in range(N - 1):&lt;br /&gt;
        if sequence[i] == &#039;1&#039;:&lt;br /&gt;
            current_ones += 1&lt;br /&gt;
        elif sequence[i] == &#039;0&#039;:&lt;br /&gt;
            current_ones -= 1&lt;br /&gt;
        &lt;br /&gt;
        if current_ones &amp;gt; max_ones:&lt;br /&gt;
            max_ones = current_ones&lt;br /&gt;
            max_ones_index = current_index&lt;br /&gt;
        &lt;br /&gt;
        current_index += 1&lt;br /&gt;
    &lt;br /&gt;
    return max_ones, max_ones_index&lt;br /&gt;
&lt;br /&gt;
def generate_initial_sequence(N, sequence):&lt;br /&gt;
    initial_sequence = [&#039;0&#039;] * N&lt;br /&gt;
    max_ones, max_ones_index = find_max_ones(N, sequence)&lt;br /&gt;
    &lt;br /&gt;
    current_ones = max_ones&lt;br /&gt;
    for i in range(max_ones_index, -1, -1):&lt;br /&gt;
        if sequence[i] == &#039;?&#039;:&lt;br /&gt;
            initial_sequence[i] = &#039;1&#039;&lt;br /&gt;
            current_ones -= 1&lt;br /&gt;
        elif sequence[i] == &#039;0&#039;:&lt;br /&gt;
            current_ones += 1&lt;br /&gt;
    &lt;br /&gt;
    for i in range(max_ones_index + 1, N):&lt;br /&gt;
        if sequence[i - 1] == &#039;?&#039;:&lt;br /&gt;
            initial_sequence[i] = &#039;1&#039;&lt;br /&gt;
        elif sequence[i - 1] == &#039;1&#039;:&lt;br /&gt;
            initial_sequence[i] = &#039;1&#039; if current_ones &amp;gt; 0 else &#039;0&#039;&lt;br /&gt;
            current_ones -= 1&lt;br /&gt;
    &lt;br /&gt;
    return &#039;&#039;.join(initial_sequence)&lt;br /&gt;
&lt;br /&gt;
def main():&lt;br /&gt;
    with open(&amp;quot;ciurulet.in&amp;quot;, &amp;quot;r&amp;quot;) as fin:&lt;br /&gt;
        N = int(fin.readline())&lt;br /&gt;
        sequence = fin.readline().strip()&lt;br /&gt;
    &lt;br /&gt;
    max_ones, _ = find_max_ones(N, sequence)&lt;br /&gt;
    initial_sequence = generate_initial_sequence(N, sequence)&lt;br /&gt;
    &lt;br /&gt;
    with open(&amp;quot;ciurulet.out&amp;quot;, &amp;quot;w&amp;quot;) as fout:&lt;br /&gt;
        fout.write(str(max_ones) + &amp;quot;\n&amp;quot;)&lt;br /&gt;
        fout.write(initial_sequence)&lt;br /&gt;
&lt;br /&gt;
if __name__ == &amp;quot;__main__&amp;quot;:&lt;br /&gt;
    main()&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>RebecaBud</name></author>
	</entry>
	<entry>
		<id>https://wiki.universitas.ro/index.php?title=0976_-_Sir_3&amp;diff=9971</id>
		<title>0976 - Sir 3</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=0976_-_Sir_3&amp;diff=9971"/>
		<updated>2024-06-03T15:47:04Z</updated>

		<summary type="html">&lt;p&gt;RebecaBud: Pagină nouă: == Enunt == Se consideră şirul de numere naturale ai cărui primi termeni sunt, în această ordine:  1, 5, 3, 7, 9, 11, 19, 17, 15, 13, 21,... Se grupează numerele din şir astfel: * prima grupă, numerotată cu 1, conţine primul termen al şirului (1) * a doua grupă, numerotată cu 2, conţine următorii doi termeni ai şirului (5,3) * a treia grupă, numerotată cu 3, conţine următorii trei termeni ai şirului (7,9,11) ………………………. * a n-a grupă din...&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Enunt ==&lt;br /&gt;
Se consideră şirul de numere naturale ai cărui primi termeni sunt, în această ordine:&lt;br /&gt;
&lt;br /&gt;
1, 5, 3, 7, 9, 11, 19, 17, 15, 13, 21,...&lt;br /&gt;
Se grupează numerele din şir astfel:&lt;br /&gt;
* prima grupă, numerotată cu 1, conţine primul termen al şirului (1)&lt;br /&gt;
* a doua grupă, numerotată cu 2, conţine următorii doi termeni ai şirului (5,3)&lt;br /&gt;
* a treia grupă, numerotată cu 3, conţine următorii trei termeni ai şirului (7,9,11)&lt;br /&gt;
……………………….&lt;br /&gt;
* a n-a grupă din şir, numerotată cu n, conţine următorii n termeni ai şirului&lt;br /&gt;
etc.&lt;br /&gt;
== Cerinţa ==&lt;br /&gt;
Deduceţi regula după care sunt generaţi termenii şirului şi scrieţi un program care să citească numerele naturale p, n şi k şi care să determine:&lt;br /&gt;
&lt;br /&gt;
a) termenul de pe poziţia p din şirul din enunţ;&lt;br /&gt;
b) cel mai mare număr natural palindrom care poate fi obţinut folosindu-se cifrele tuturor numerelor din grupa a n-a a şirului dat, nu neapărat toate aceste cifre;&lt;br /&gt;
c) numărul grupei ce conţine un număr maxim de termeni şi are proprietatea că suma acestor termeni este cel mult egală cu k.&lt;br /&gt;
== Date de intrare ==&lt;br /&gt;
Programul citește de la tastatură cele trei numere, &#039;&#039;&#039;p n k&#039;&#039;&#039;.&lt;br /&gt;
== Date de ieșire ==&lt;br /&gt;
Programul va afișa pe ecran trei numere, reprezentând, în ordine:&lt;br /&gt;
&lt;br /&gt;
* termenul de pe poziţia p din şirul din enunţ;&lt;br /&gt;
* cel mai mare număr natural palindrom care poate fi obţinut folosindu-se cifrele din scrierea zecimală a &lt;br /&gt;
* tuturor termenilor din grupa a n-a a şirului dat, nu neapărat toate aceste cifre;&lt;br /&gt;
* pe a treia linie se va scrie numărul grupei ce conţine un număr maxim de termeni şi are proprietatea că suma &lt;br /&gt;
* acestora este cel mult egală cu k.&lt;br /&gt;
== Restricţii şi precizări ==&lt;br /&gt;
* Numerele p, n şi k sunt naturale&lt;br /&gt;
* &#039;&#039;&#039;1 ≤ p ≤ 1000000000&#039;&#039;&#039;&lt;br /&gt;
* &#039;&#039;&#039;1 ≤ n ≤ 50&#039;&#039;&#039;&lt;br /&gt;
* &#039;&#039;&#039;1 ≤ k ≤ 2000000000&#039;&#039;&#039;&lt;br /&gt;
* un număr natural este palindrom dacă este egal cu numărul obţinut prin scrierea cifrelor sale în ordine inversă&lt;br /&gt;
* Pentru rezolvarea cerinţei a) se acordă 40% din punctaj, pentru cerinţa b) 30% din punctaj şi pentru cerinţa c) 30% din punctaj.&lt;br /&gt;
== Exemplul 1 ==&lt;br /&gt;
; Intrare&lt;br /&gt;
&lt;br /&gt;
7 5 127&lt;br /&gt;
; Ieșire&lt;br /&gt;
&lt;br /&gt;
19&lt;br /&gt;
22922&lt;br /&gt;
5&lt;br /&gt;
== Explicație ==&lt;br /&gt;
* Primii 7 termeni ai şirului sunt: 1,5,3,7,9,11,19. Termenul căutat are valoarea 19.&lt;br /&gt;
* Numerele din grupa a 5-a sunt scrise cu ajutorul a cinci cifre de 2, o cifră de 3, una de 5, una de 7, una de 9. &lt;br /&gt;
* Cel mai mare palindrom care se poate scrie cu aceste cifre este 22922.&lt;br /&gt;
* Grupele a căror sumă este cel mult egală cu k=127 sunt: 1,2,3,4,5. Grupa cu cei mai mulţi termeni şi cu suma maximă (=125) este grupa 5.&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;gt;&lt;br /&gt;
def generate_sequence(n):&lt;br /&gt;
    sequence = [1]&lt;br /&gt;
    current = 5&lt;br /&gt;
    for i in range(2, n + 1):&lt;br /&gt;
        sequence.extend(range(current, current + i))&lt;br /&gt;
        current += i + 1&lt;br /&gt;
    return sequence&lt;br /&gt;
&lt;br /&gt;
def find_term(p, n):&lt;br /&gt;
    sequence = generate_sequence(n)&lt;br /&gt;
    return sequence[p - 1]&lt;br /&gt;
&lt;br /&gt;
def is_palindrome(num):&lt;br /&gt;
    return str(num) == str(num)[::-1]&lt;br /&gt;
&lt;br /&gt;
def find_largest_palindrome(numbers):&lt;br /&gt;
    palindromes = [int(str(num)[::-1]) for num in numbers if is_palindrome(num)]&lt;br /&gt;
    return max(palindromes)&lt;br /&gt;
&lt;br /&gt;
def find_max_group(p, n, k):&lt;br /&gt;
    max_sum = 0&lt;br /&gt;
    max_group = 0&lt;br /&gt;
    sequence = generate_sequence(n)&lt;br /&gt;
    for i in range(1, n + 1):&lt;br /&gt;
        group = sequence[sum(range(i)) : sum(range(i + 1))]&lt;br /&gt;
        group_sum = sum(group)&lt;br /&gt;
        if group_sum &amp;lt;= k and len(group) &amp;gt; max_group:&lt;br /&gt;
            max_group = len(group)&lt;br /&gt;
            max_sum = group_sum&lt;br /&gt;
    return max_group&lt;br /&gt;
&lt;br /&gt;
p, n, k = map(int, input().split())&lt;br /&gt;
&lt;br /&gt;
# a)&lt;br /&gt;
term = find_term(p, n)&lt;br /&gt;
print(term)&lt;br /&gt;
&lt;br /&gt;
# b)&lt;br /&gt;
group_n = generate_sequence(n)[sum(range(n)): sum(range(n + 1))]&lt;br /&gt;
largest_palindrome = find_largest_palindrome(group_n)&lt;br /&gt;
print(largest_palindrome)&lt;br /&gt;
&lt;br /&gt;
# c)&lt;br /&gt;
max_group = find_max_group(p, n, k)&lt;br /&gt;
print(max_group)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>RebecaBud</name></author>
	</entry>
	<entry>
		<id>https://wiki.universitas.ro/index.php?title=3607_-_Run&amp;diff=9967</id>
		<title>3607 - Run</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=3607_-_Run&amp;diff=9967"/>
		<updated>2024-06-03T15:40:47Z</updated>

		<summary type="html">&lt;p&gt;RebecaBud: Pagină nouă:  == Cerinţa == În această dimineață Aky, un băiat sportiv, s-a hotărât să meargă la alergat. Acesta vrea după ce ajunge acasă să își rezolve tema la informatică și pentru asta trebuie să nu fie foarte obosit în urma antrenamentului, deci vrea să își aleagă un traseu cât mai ușor pe care să alerge, iar pentru asta și-a pus la punct un plan foarte exact.  Acesta are în orașul său o distanță N kilometri legați, numerotați de la 1 la N, iar fiec...&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
== Cerinţa ==&lt;br /&gt;
În această dimineață Aky, un băiat sportiv, s-a hotărât să meargă la alergat. Acesta vrea după ce ajunge acasă să își rezolve tema la informatică și pentru asta trebuie să nu fie foarte obosit în urma antrenamentului, deci vrea să își aleagă un traseu cât mai ușor pe care să alerge, iar pentru asta și-a pus la punct un plan foarte exact.&lt;br /&gt;
&lt;br /&gt;
Acesta are în orașul său o distanță N kilometri legați, numerotați de la 1 la N, iar fiecărui kilometru i din cele N(1 ≤ i ≤ N) îi cunoaște gradul de dificultate a[i]. Băiatul a întocmit o listă cu M intervale diferite de kilometri de forma [l, r], fiecare interval având un anumit grad de oboseală asociat acestuia. Gradul de oboseală G asociat unui interval [l, r] de lungime L = r - l + 1 se calculează astfel: G = a[l] * L + a[l + 1] * (L - 1) + ... + a[r - 1] * 2 + a[r] * 1 și reprezintă cu cât va crește valoarea de oboseală a lui Aky dupa ce va alerga kilometrii intervalului respectiv. Acum Aky vă cere vouă să-l ajutați să-și ducă planul la sfârșit, aflând care este valoarea minimă de oboseală pe care o poate avea la finalul antrenamentului său, știind că trebuie sa alerge kilometrii a exact K din intervalele din lista sa.&lt;br /&gt;
== Date de intrare ==&lt;br /&gt;
Fişierul de intrare &#039;&#039;&#039;run.in&#039;&#039;&#039; are pe prima linie numerele N M K, reprezentând numărul de kilometri din orașul lui Aky, numărul de intervale din lista sa, respectiv câte dintre intervale trebuie să aleagă pentru alergat, pe a 2-a linie N numere naturale a[1], a[2], ..., a[N], reprezentând gradele de dificultate ale celor N kilometri, iar pe următoarele M linii câte 2 numere l r reprezentând intervalele din lista lui Aky.&lt;br /&gt;
== Date de ieșire ==&lt;br /&gt;
Fişierul de ieşire &#039;&#039;&#039;run.out&#039;&#039;&#039; va conţine pe prima linie numărul natural V, reprezentând valoarea minimă de oboseală pe care o poate avea băiatul la finalul antrenamentului său.&lt;br /&gt;
== Restricţii şi precizări ==&lt;br /&gt;
* &#039;&#039;&#039;1 ≤ N, M ≤ 100.000&#039;&#039;&#039;&lt;br /&gt;
* &#039;&#039;&#039;1 ≤ K ≤ M&#039;&#039;&#039;&lt;br /&gt;
* &#039;&#039;&#039;1 ≤ a[i] ≤ 10.000&#039;&#039;&#039;&lt;br /&gt;
* &#039;&#039;&#039;1 ≤ l ≤ r ≤ n&#039;&#039;&#039;&lt;br /&gt;
* pentru teste în valoare de 50 de puncte &#039;&#039;&#039;N ≤ 5.000&#039;&#039;&#039; și &#039;&#039;&#039;M ≤ 5.000&#039;&#039;&#039;&lt;br /&gt;
== Exemplul 1 ==&lt;br /&gt;
; run.in&lt;br /&gt;
&lt;br /&gt;
5 5 3&lt;br /&gt;
2 3 1 5 6&lt;br /&gt;
1 3&lt;br /&gt;
1 4&lt;br /&gt;
3 4&lt;br /&gt;
2 5&lt;br /&gt;
4 5&lt;br /&gt;
; run.out&lt;br /&gt;
&lt;br /&gt;
36&lt;br /&gt;
== Explicație == &lt;br /&gt;
Vom lua fiecare interval și vom calcula gradul său de oboseală:&lt;br /&gt;
* [1, 3]: G = 2 * 3 + 3 * 2 + 1 * 1 = 13&lt;br /&gt;
* [1, 4]: G = 2 * 4 + 3 * 3 + 1 * 2 + 5 * 1 = 24&lt;br /&gt;
* [3, 4]: G = 1 * 2 + 5 * 1 = 7&lt;br /&gt;
* [2, 5]: G = 3 * 4 + 1 * 3 + 5 * 2 + 6 * 1 = 31&lt;br /&gt;
* [4, 5]: G = 5 * 2 + 6 * 1 = 16&lt;br /&gt;
&lt;br /&gt;
Obținem în final gradele de oboseală 13 24 7 31 16 din care Aky trebuie să aleagă 3 astfel încât valoarea sa de oboseală să fie minimă. Acesta elege primul, al treilea, respectiv ultimul interval obținând valoarea de oboseală minimă &#039;&#039;&#039;13 + 7 + 16 = 36&#039;&#039;&#039;.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&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;gt;&lt;br /&gt;
with open(&amp;quot;run.in&amp;quot;, &amp;quot;r&amp;quot;) as fin:&lt;br /&gt;
    N, M, K = map(int, fin.readline().split())&lt;br /&gt;
    difficulties = list(map(int, fin.readline().split()))&lt;br /&gt;
    intervals = [tuple(map(int, fin.readline().split())) for _ in range(M)]&lt;br /&gt;
&lt;br /&gt;
def fatigue(interval, difficulties):&lt;br /&gt;
    l, r = interval&lt;br /&gt;
    fatigue_value = 0&lt;br /&gt;
    for i in range(l, r + 1):&lt;br /&gt;
        fatigue_value += difficulties[i - 1] * (r - i + 1)&lt;br /&gt;
    return fatigue_value&lt;br /&gt;
&lt;br /&gt;
sorted_intervals = sorted(intervals, key=lambda interval: fatigue(interval, difficulties))&lt;br /&gt;
min_fatigue = sum(fatigue(interval, difficulties) for interval in sorted_intervals[:K])&lt;br /&gt;
&lt;br /&gt;
with open(&amp;quot;run.out&amp;quot;, &amp;quot;w&amp;quot;) as fout:&lt;br /&gt;
    fout.write(str(min_fatigue))&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>RebecaBud</name></author>
	</entry>
	<entry>
		<id>https://wiki.universitas.ro/index.php?title=4196_-_MPF&amp;diff=9962</id>
		<title>4196 - MPF</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=4196_-_MPF&amp;diff=9962"/>
		<updated>2024-06-03T15:26:52Z</updated>

		<summary type="html">&lt;p&gt;RebecaBud: Pagină nouă: == Enunt == Fie &amp;#039;&amp;#039;&amp;#039;X&amp;#039;&amp;#039;&amp;#039; un număr natural nenul și &amp;#039;&amp;#039;&amp;#039;p&amp;#039;&amp;#039;&amp;#039; cel mai mare factor prim din descompunerea în factori primi a lui &amp;#039;&amp;#039;&amp;#039;X&amp;#039;&amp;#039;&amp;#039;. Pentru &amp;#039;&amp;#039;&amp;#039;X = 1&amp;#039;&amp;#039;&amp;#039;, considerăm &amp;#039;&amp;#039;&amp;#039;p = 1&amp;#039;&amp;#039;&amp;#039;. Asupra lui &amp;#039;&amp;#039;&amp;#039;X&amp;#039;&amp;#039;&amp;#039; se pot efectua următoarele două operații:  Operația 1: &amp;#039;&amp;#039;&amp;#039;X&amp;#039;&amp;#039;&amp;#039; se împarte la &amp;#039;&amp;#039;&amp;#039;p&amp;#039;&amp;#039;&amp;#039; și devine &amp;#039;&amp;#039;&amp;#039;X / p&amp;#039;&amp;#039;&amp;#039;; Operația 2: &amp;#039;&amp;#039;&amp;#039;X&amp;#039;&amp;#039;&amp;#039; devine &amp;#039;&amp;#039;&amp;#039;X * k&amp;#039;&amp;#039;&amp;#039;, unde &amp;#039;&amp;#039;&amp;#039;k&amp;#039;&amp;#039;&amp;#039; este un număr prim și mai mare sau egal decât &amp;#039;&amp;#039;&amp;#039;p&amp;#039;&amp;#039;&amp;#039;. == Cerinţa == Se dau &amp;#039;&amp;#039;&amp;#039;Q&amp;#039;&amp;#039;&amp;#039; perechi de numere natura...&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Enunt ==&lt;br /&gt;
Fie &#039;&#039;&#039;X&#039;&#039;&#039; un număr natural nenul și &#039;&#039;&#039;p&#039;&#039;&#039; cel mai mare factor prim din descompunerea în factori primi a lui &#039;&#039;&#039;X&#039;&#039;&#039;. Pentru &#039;&#039;&#039;X = 1&#039;&#039;&#039;, considerăm &#039;&#039;&#039;p = 1&#039;&#039;&#039;. Asupra lui &#039;&#039;&#039;X&#039;&#039;&#039; se pot efectua următoarele două operații:&lt;br /&gt;
&lt;br /&gt;
Operația 1: &#039;&#039;&#039;X&#039;&#039;&#039; se împarte la &#039;&#039;&#039;p&#039;&#039;&#039; și devine &#039;&#039;&#039;X / p&#039;&#039;&#039;;&lt;br /&gt;
Operația 2: &#039;&#039;&#039;X&#039;&#039;&#039; devine &#039;&#039;&#039;X * k&#039;&#039;&#039;, unde &#039;&#039;&#039;k&#039;&#039;&#039; este un număr prim și mai mare sau egal decât &#039;&#039;&#039;p&#039;&#039;&#039;.&lt;br /&gt;
== Cerinţa ==&lt;br /&gt;
Se dau &#039;&#039;&#039;Q&#039;&#039;&#039; perechi de numere naturale nenule &#039;&#039;&#039;(X, Y)&#039;&#039;&#039;. Să se determine, pentru fiecare pereche, numărul minim de operații necesare pentru a-l transforma pe &#039;&#039;&#039;X&#039;&#039;&#039; în &#039;&#039;&#039;Y&#039;&#039;&#039;.&lt;br /&gt;
== Date de intrare ==&lt;br /&gt;
Datele de intrare conțin &#039;&#039;&#039;Q + 1&#039;&#039;&#039; linii. Pe prima linie se găsește &#039;&#039;&#039;Q&#039;&#039;&#039; reprezentând numărul de perechi &#039;&#039;&#039;(X, Y)&#039;&#039;&#039;.&lt;br /&gt;
Pe următoarele &#039;&#039;&#039;Q&#039;&#039;&#039; linii, câte o pereche de numere naturale nenule &#039;&#039;&#039;X&#039;&#039;&#039; și &#039;&#039;&#039;Y&#039;&#039;&#039;, despărțite printr-un singur spațiu.&lt;br /&gt;
== Date de ieșire ==&lt;br /&gt;
Ieșirea va conține &#039;&#039;&#039;Q&#039;&#039;&#039; linii. Pe fiecare linie &#039;&#039;&#039;i&#039;&#039;&#039; se va scrie câte un număr natural reprezentând, numărul de operații determinat pentru a i-a pereche.&lt;br /&gt;
== Restricţii şi precizări ==&lt;br /&gt;
* &#039;&#039;&#039;1 ≤ Q ≤ 1.000.000&#039;&#039;&#039;&lt;br /&gt;
* &#039;&#039;&#039;1 ≤ X, Y ≤ 4.000.000&#039;&#039;&#039;&lt;br /&gt;
Datorită dimensiunii mari a datelor de intrare și de ieșire, doar unele teste au fost adăugate.&lt;br /&gt;
== Exemplul 1 ==&lt;br /&gt;
; Intrare&lt;br /&gt;
&lt;br /&gt;
4&lt;br /&gt;
4 10&lt;br /&gt;
2 9&lt;br /&gt;
6 2&lt;br /&gt;
12 12&lt;br /&gt;
; Ieșire&lt;br /&gt;
&lt;br /&gt;
2&lt;br /&gt;
3&lt;br /&gt;
1&lt;br /&gt;
0&lt;br /&gt;
== Explicație == &lt;br /&gt;
Pentru (4, 10): 4 devine 2 utilizând o Operație 1, apoi devine 10 utilizând o Operație 2.&lt;br /&gt;
Pentru (2, 9): 2 devine 1 utilizând o Operație 1, apoi devine 3 folosind o Operație 2 și devine 9 folosind o Operație 2.&lt;br /&gt;
Pentru (6, 2): 6 devine 2 folosind o Operație de tip 1.&lt;br /&gt;
Pentru (12, 12): Numerele sunt egale, nu este necesară nicio operație.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&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;gt;&lt;br /&gt;
def max_prime_factor(x):&lt;br /&gt;
    factor = 2&lt;br /&gt;
    while factor * factor &amp;lt;= x:&lt;br /&gt;
        if x % factor == 0:&lt;br /&gt;
            x //= factor&lt;br /&gt;
        else:&lt;br /&gt;
            factor += 1&lt;br /&gt;
    return x&lt;br /&gt;
&lt;br /&gt;
with open(&amp;quot;input.in&amp;quot;, &amp;quot;r&amp;quot;) as fin:&lt;br /&gt;
    q = int(fin.readline())&lt;br /&gt;
    pairs = [tuple(map(int, line.split())) for line in fin]&lt;br /&gt;
&lt;br /&gt;
with open(&amp;quot;output.out&amp;quot;, &amp;quot;w&amp;quot;) as fout:&lt;br /&gt;
    for pair in pairs:&lt;br /&gt;
        x, y = pair&lt;br /&gt;
        if x == y:&lt;br /&gt;
            fout.write(&amp;quot;0\n&amp;quot;)&lt;br /&gt;
        elif max_prime_factor(x) == max_prime_factor(y):&lt;br /&gt;
            fout.write(&amp;quot;1\n&amp;quot;)&lt;br /&gt;
        else:&lt;br /&gt;
            fout.write(&amp;quot;2\n&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>RebecaBud</name></author>
	</entry>
	<entry>
		<id>https://wiki.universitas.ro/index.php?title=3468_-_weekend&amp;diff=9960</id>
		<title>3468 - weekend</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=3468_-_weekend&amp;diff=9960"/>
		<updated>2024-06-03T15:20:54Z</updated>

		<summary type="html">&lt;p&gt;RebecaBud: Pagină nouă: == Enunt ==  În acest weekend tocmai s-au pus în vânzare bilete pentru concertul celui mai în vogă artist. Cum acesta este extrem de popular, un număr de n persoane s-au așezat la coadă la casa de bilete. Pentru simplitate, prima persoană așezată la coadă va avea indicele 1, a doua va avea indicele 2 și așa mai departe.  Deoarece statul la coadă este extrem de plictisitor, fiecare om a început să numere câte persoane mai scunde decât el se află în fața s...&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Enunt ==&lt;br /&gt;
&lt;br /&gt;
În acest weekend tocmai s-au pus în vânzare bilete pentru concertul celui mai în vogă artist. Cum acesta este extrem de popular, un număr de n persoane s-au așezat la coadă la casa de bilete. Pentru simplitate, prima persoană așezată la coadă va avea indicele 1, a doua va avea indicele 2 și așa mai departe.&lt;br /&gt;
&lt;br /&gt;
Deoarece statul la coadă este extrem de plictisitor, fiecare om a început să numere câte persoane mai scunde decât el se află în fața sa. Se cunoaște că înălțimile oamenilor sunt reprezentate cu numere naturale nenule.&lt;br /&gt;
&lt;br /&gt;
Din lipsă de imaginație, oamenii care stau la coadă nu au reușit sa ducă jocul până la capăt, așa că o vom face noi. Cunoscând câte persoane mai scunde decât el are în față fiecare om care stă la coadă, se cere să se determine înălțimea fiecărui om din șir.&lt;br /&gt;
&lt;br /&gt;
Dacă există mai multe soluții valide, se cere afișată soluția minim lexicografică. Dacă există două șiruri valide de înălțimi ale celor n persoane A1, A2 ,…, An și B1, B2, …, Bn spunem că șirul A este mai mic lexicografic decât B dacă există un număr natural i mai mic sau egal decât n astfel încât Ai &amp;lt; Bi și Aj = Bj, oricare ar fi j = 1..i-1.&lt;br /&gt;
== Cerinţa ==&lt;br /&gt;
Fiind dat șirul inițial de observații ale oamenilor care stau la coadă, să se reconstruiască șirul minim lexicografic care poate reprezenta înălțimile acestora.&lt;br /&gt;
== Date de intrare ==&lt;br /&gt;
Fișierul de intrare &#039;&#039;&#039;weekend.in&#039;&#039;&#039; va avea pe prima linie numărul &#039;&#039;&#039;n&#039;&#039;&#039;. Pe linia a doua se va afla un șir de &#039;&#039;&#039;n&#039;&#039;&#039; numere naturale despărțite printr-un spațiu, valoarea aflată pe poziția &#039;&#039;&#039;i&#039;&#039;&#039; semnificând numărul de persoane strict mai scunde decât persoana &#039;&#039;&#039;i&#039;&#039;&#039; și cu indice mai mic decât &#039;&#039;&#039;i&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Date de ieșire ==&lt;br /&gt;
În fișierul de ieșire &#039;&#039;&#039;weekend.out&#039;&#039;&#039; se va afișa șirul înălțimilor. Pe linia a i-a din fișierul de ieșire se va afla înălțimea persoanei cu indicele i.&lt;br /&gt;
== Restricţii şi precizări ==&lt;br /&gt;
* Se garantează că setul de date este corect și va exista mereu cel puțin o soluție.&lt;br /&gt;
* Două sau mai multe persoane NU pot avea aceeași înălțime.&lt;br /&gt;
* &#039;&#039;&#039;1 ≤ N ≤ 200.000&#039;&#039;&#039;&lt;br /&gt;
* Pentru 40% din teste, N &amp;lt;= 5.000&lt;br /&gt;
&lt;br /&gt;
== Exemplul 1 ==&lt;br /&gt;
; weekend.in&lt;br /&gt;
&lt;br /&gt;
4&lt;br /&gt;
0 1 1 0&lt;br /&gt;
; weekend.out&lt;br /&gt;
&lt;br /&gt;
2&lt;br /&gt;
4&lt;br /&gt;
3&lt;br /&gt;
1&lt;br /&gt;
== Explicație ==&lt;br /&gt;
Observăm că acesta este cel mai mic șir lexicografic care satisface șirul de observații din input. O altă soluție ar fi fost șirul 2 5 3 1, dar acesta este mai mare lexicografic.&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;gt;&lt;br /&gt;
with open(&amp;quot;weekend.in&amp;quot;, &amp;quot;r&amp;quot;) as fin:&lt;br /&gt;
    n = int(fin.readline().strip())&lt;br /&gt;
    observations = list(map(int, fin.readline().split()))&lt;br /&gt;
&lt;br /&gt;
heights = [0] * n&lt;br /&gt;
&lt;br /&gt;
for i in range(n - 1, -1, -1):&lt;br /&gt;
    taller_count = observations[i]&lt;br /&gt;
    height = 1&lt;br /&gt;
    for j in range(taller_count):&lt;br /&gt;
        height = max(heights[i + j + 1] + 1, height)&lt;br /&gt;
    heights[i] = height&lt;br /&gt;
&lt;br /&gt;
with open(&amp;quot;weekend.out&amp;quot;, &amp;quot;w&amp;quot;) as fout:&lt;br /&gt;
    for height in heights:&lt;br /&gt;
        fout.write(str(height) + &amp;quot;\n&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>RebecaBud</name></author>
	</entry>
	<entry>
		<id>https://wiki.universitas.ro/index.php?title=1950_-_PXP&amp;diff=9956</id>
		<title>1950 - PXP</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=1950_-_PXP&amp;diff=9956"/>
		<updated>2024-06-03T15:10:49Z</updated>

		<summary type="html">&lt;p&gt;RebecaBud: Pagină nouă: == Cerinţa == Se dă un şir format din &amp;#039;&amp;#039;&amp;#039;N&amp;#039;&amp;#039;&amp;#039; numere naturale nenule. Spunem că un număr e fericit dacă se poate scrie ca suma pătratelor a două numere naturale. Notăm cu &amp;#039;&amp;#039;&amp;#039;K&amp;#039;&amp;#039;&amp;#039; numărul numerelor fericite din şir şi cu &amp;#039;&amp;#039;&amp;#039;P&amp;#039;&amp;#039;&amp;#039; produsul acestora. Aflaţi numărul &amp;#039;&amp;#039;&amp;#039;K&amp;#039;&amp;#039;&amp;#039; precum şi două numere naturale care au suma pătratelor egală cu &amp;#039;&amp;#039;&amp;#039;PE&amp;#039;&amp;#039;&amp;#039;, unde &amp;#039;&amp;#039;&amp;#039;E&amp;#039;&amp;#039;&amp;#039; este un număr natural dat. == Date de intrare == Fișierul de intrare &amp;#039;&amp;#039;&amp;#039;pxp.in&amp;#039;&amp;#039;&amp;#039; conține pe prima lin...&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Cerinţa ==&lt;br /&gt;
Se dă un şir format din &#039;&#039;&#039;N&#039;&#039;&#039; numere naturale nenule. Spunem că un număr e fericit dacă se poate scrie ca suma pătratelor a două numere naturale. Notăm cu &#039;&#039;&#039;K&#039;&#039;&#039; numărul numerelor fericite din şir şi cu &#039;&#039;&#039;P&#039;&#039;&#039; produsul acestora. Aflaţi numărul &#039;&#039;&#039;K&#039;&#039;&#039; precum şi două numere naturale care au suma pătratelor egală cu &#039;&#039;&#039;PE&#039;&#039;&#039;, unde &#039;&#039;&#039;E&#039;&#039;&#039; este un număr natural dat.&lt;br /&gt;
== Date de intrare ==&lt;br /&gt;
Fișierul de intrare &#039;&#039;&#039;pxp.in&#039;&#039;&#039; conține pe prima linie numerele N şi E , iar pe a doua linie N numere naturale separate prin spațiu.&lt;br /&gt;
== Date de ieșire ==&lt;br /&gt;
Fișierul de ieșire &#039;&#039;&#039;pxp.out&#039;&#039;&#039; va conține pe prima linie numărul K, reprezentând numărul numerelor fericite din şir iar pe a doua linie cele două numere care au suma pătratelor egală cu PE.&lt;br /&gt;
== Restricţii şi precizări ==&lt;br /&gt;
* 1 ≤ N ≤ 100.000&lt;br /&gt;
* 1 ≤ E ≤ 3 &lt;br /&gt;
* numerele din şir sunt mai mici decât 1.000.001 şi cel puţin un număr din şir este fericit&lt;br /&gt;
* 1 ≤ P ≤ 1036&lt;br /&gt;
* pentru a doua cerinţă se va afişa orice soluţie, fiecare test având soluţie&lt;br /&gt;
* pentru prima cerinţă se acordă 40p, iar pentru a doua 60p&lt;br /&gt;
* 0% din teste au P ≤ 1000000, iar alte 40% au P ≤ 1018&lt;br /&gt;
&lt;br /&gt;
== Exemplul 1 ==&lt;br /&gt;
; pxp.in&lt;br /&gt;
&lt;br /&gt;
5 1&lt;br /&gt;
11 2 13 7 5&lt;br /&gt;
; pxp.out&lt;br /&gt;
&lt;br /&gt;
3&lt;br /&gt;
3 11&lt;br /&gt;
== Explicație ==&lt;br /&gt;
Avem &#039;&#039;&#039;N=5&#039;&#039;&#039; şi &#039;&#039;&#039;E=1&#039;&#039;&#039;. În şir sunt 3 numere fericite, 2, 13 şi 5, deoarece 2=12+12 , 13=22+32 şi 5=12+22. Produsul lor este 130=32+112, deci două numere pentru care suma pătratelor este P1 sunt 3 şi 11.&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;gt;&lt;br /&gt;
def is_happy_number(num):&lt;br /&gt;
    i = 1&lt;br /&gt;
    while i * i &amp;lt;= num:&lt;br /&gt;
        if num - i * i == int((num - i * i) ** 0.5) ** 2:&lt;br /&gt;
            return True&lt;br /&gt;
        i += 1&lt;br /&gt;
    return False&lt;br /&gt;
&lt;br /&gt;
with open(&amp;quot;pxp.in&amp;quot;, &amp;quot;r&amp;quot;) as fin:&lt;br /&gt;
    N, E = map(int, fin.readline().split())&lt;br /&gt;
    numbers = list(map(int, fin.readline().split()))&lt;br /&gt;
&lt;br /&gt;
happy_numbers = []&lt;br /&gt;
product = 1&lt;br /&gt;
for num in numbers:&lt;br /&gt;
    if is_happy_number(num):&lt;br /&gt;
        happy_numbers.append(num)&lt;br /&gt;
        product *= num&lt;br /&gt;
&lt;br /&gt;
K = len(happy_numbers)&lt;br /&gt;
&lt;br /&gt;
target_sum = product * E&lt;br /&gt;
found = False&lt;br /&gt;
for i in range(len(happy_numbers)):&lt;br /&gt;
    for j in range(i + 1, len(happy_numbers)):&lt;br /&gt;
        if happy_numbers[i] ** 2 + happy_numbers[j] ** 2 == target_sum:&lt;br /&gt;
            result = (happy_numbers[i], happy_numbers[j])&lt;br /&gt;
            found = True&lt;br /&gt;
            break&lt;br /&gt;
    if found:&lt;br /&gt;
        break&lt;br /&gt;
&lt;br /&gt;
with open(&amp;quot;pxp.out&amp;quot;, &amp;quot;w&amp;quot;) as fout:&lt;br /&gt;
    fout.write(str(K) + &amp;quot;\n&amp;quot;)&lt;br /&gt;
    fout.write(&amp;quot; &amp;quot;.join(map(str, result)))&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>RebecaBud</name></author>
	</entry>
	<entry>
		<id>https://wiki.universitas.ro/index.php?title=3034_-_Drept_1&amp;diff=9953</id>
		<title>3034 - Drept 1</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=3034_-_Drept_1&amp;diff=9953"/>
		<updated>2024-06-03T15:01:37Z</updated>

		<summary type="html">&lt;p&gt;RebecaBud: Pagină nouă: == Enunt == Numim &amp;#039;&amp;#039;&amp;#039;poligon drept&amp;#039;&amp;#039;&amp;#039; un poligon cu laturile consecutive perpendiculare și lungimile laturilor numere naturale nenule. Un poligon drept cu n laturi este descris de un șir de n numere întregi nenule în care lungimile laturilor sunt date de valoarea absolută a numerelor din șir, iar semnul precizează poziția laturilor, un număr pozitiv însemnând latură spre dreapta sau în sus față de extremitatea laturii precedente, iar un număr negativ însemnâ...&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Enunt ==&lt;br /&gt;
Numim &#039;&#039;&#039;poligon drept&#039;&#039;&#039; un poligon cu laturile consecutive perpendiculare și lungimile laturilor numere naturale nenule. Un poligon drept cu n laturi este descris de un șir de n numere întregi nenule în care lungimile laturilor sunt date de valoarea absolută a numerelor din șir, iar semnul precizează poziția laturilor, un număr pozitiv însemnând latură spre dreapta sau în sus față de extremitatea laturii precedente, iar un număr negativ însemnând latură în jos sau spre stânga față de extremitatea laturii precedente; de exemplu șirul 1, 1, -1, -1 reprezintă un pătrat de latură 1 (prima latură spre dreapta, a doua în sus, a treia spre stânga, a patra în jos). Vom considera laturile ca fiind orizontale sau verticale, prima latură enumerată fiind orizontală spre dreapta, dacă numărul este pozitiv, sau spre stânga, dacă numărul este negativ.&lt;br /&gt;
== Cerinţa ==&lt;br /&gt;
Se dau unul sau mai multe șiruri de numere întregi nenule.&lt;br /&gt;
1. Să se stabilească, pentru fiecare dintre ele, dacă reprezintă un poligon drept.&lt;br /&gt;
2. Știind că șirurile date reprezintă poligoane drepte, să se determine aria fiecăruia.&lt;br /&gt;
== Date de intrare ==&lt;br /&gt;
Fișierul de intrare &#039;&#039;&#039;drept.in&#039;&#039;&#039; conține pe prima linie, separate prin spațiu, un număr natural C și un număr natural T. Următoarele 2 * T linii vor descrie testele, câte două linii pentru fiecare test. Pe prima linie corespunzătoare unui test se află un număr natural n, iar pe a doua linie un șir de n numere întregi, separate prin câte un spațiu.&lt;br /&gt;
== Date de ieșire ==&lt;br /&gt;
Fișierul de ieșire &#039;&#039;&#039;drept.out&#039;&#039;&#039; va conține pe o singură linie rezultatele corespunzătoare celor T teste, separate prin câte un spațiu. Dacă C = 1 pentru fiecare șir rezultatul este 1, dacă acesta reprezintă un poligon drept, sau 0 altfel. Dacă C = 2 pentru fiecare șir rezultatul este aria poligonului drept corespunzător.&lt;br /&gt;
== Restricţii şi precizări ==&lt;br /&gt;
* &#039;&#039;&#039;1 ≤ T ≤ 10&#039;&#039;&#039;&lt;br /&gt;
* &#039;&#039;&#039;4 ≤ n ≤ 100&#039;&#039;&#039;&lt;br /&gt;
*Pentru teste în valoare de 45 de puncte C = 1, pentru restul de 55 de puncte C = 2&lt;br /&gt;
*Pentru teste în valoare de 30 de puncte C = 1 și numerele ce descriu figura sunt întregi nenule aparținând intervalului [-100, 100]&lt;br /&gt;
*Pentru celelalte 15 puncte și C = 1 numerele ce descriu figura sunt întregi nenule aparținând intervalului [-1.000.000.000, 1.000.000.000]&lt;br /&gt;
*Pentru teste în valoare de 33 de puncte se garantează că avem C = 2 și intersecția dintre orice orizontală cu poligonul este fie vidă, fie formată dintr-un singur segment.&lt;br /&gt;
*Pentru testele în care valoarea lui C este 2, numerele din șirul ce descrie poligonul sunt întregi nenule din intervalul [-100, 100] și se garantează că aceste șiruri reprezintă poligoane drepte.&lt;br /&gt;
*Într-un poligon drept laturile nu au puncte comune, exceptând capetele laturilor adiacente.&lt;br /&gt;
*Prima și ultima latură ale unui poligon drept sunt perpendiculare.&lt;br /&gt;
== Exemplul 1 ==&lt;br /&gt;
; drept.in&lt;br /&gt;
&lt;br /&gt;
1 2 &lt;br /&gt;
8 &lt;br /&gt;
5 3 -3 -1 2 -1 -4 -1 &lt;br /&gt;
8 &lt;br /&gt;
-2 1 3 1 -4 -3 2 1&lt;br /&gt;
; drept.out&lt;br /&gt;
&lt;br /&gt;
1 0&lt;br /&gt;
Explicație&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Exemplul 2 ==&lt;br /&gt;
; drept.in&lt;br /&gt;
&lt;br /&gt;
2 2 &lt;br /&gt;
8 &lt;br /&gt;
5 3 -3 -1 2 -1 -4 -1 &lt;br /&gt;
4 &lt;br /&gt;
1 1 -1 -1&lt;br /&gt;
; drept.out&lt;br /&gt;
&lt;br /&gt;
9 1&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;gt;&lt;br /&gt;
with open(&amp;quot;drept.in&amp;quot;, &amp;quot;r&amp;quot;) as fin:&lt;br /&gt;
    C, T = map(int, fin.readline().split())&lt;br /&gt;
    results = []&lt;br /&gt;
    for _ in range(T):&lt;br /&gt;
        n = int(fin.readline().strip())&lt;br /&gt;
        polygon = list(map(int, fin.readline().split()))&lt;br /&gt;
        &lt;br /&gt;
        is_polygon = True&lt;br /&gt;
        for i in range(n):&lt;br /&gt;
            if polygon[i] == 0:&lt;br /&gt;
                is_polygon = False&lt;br /&gt;
                break&lt;br /&gt;
            if i % 2 == 0:&lt;br /&gt;
                if polygon[i] &amp;lt; 0:&lt;br /&gt;
                    is_polygon = False&lt;br /&gt;
                    break&lt;br /&gt;
            else:&lt;br /&gt;
                if polygon[i] &amp;gt; 0:&lt;br /&gt;
                    is_polygon = False&lt;br /&gt;
                    break&lt;br /&gt;
        &lt;br /&gt;
        if C == 1:&lt;br /&gt;
            results.append(1 if is_polygon else 0)&lt;br /&gt;
        elif C == 2:&lt;br /&gt;
            area = 0&lt;br /&gt;
            for i in range(0, n, 2):&lt;br /&gt;
                area += abs(polygon[i]) * abs(polygon[i + 1])&lt;br /&gt;
            results.append(area)&lt;br /&gt;
        &lt;br /&gt;
    with open(&amp;quot;drept.out&amp;quot;, &amp;quot;w&amp;quot;) as fout:&lt;br /&gt;
        fout.write(&amp;quot; &amp;quot;.join(map(str, results)))&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>RebecaBud</name></author>
	</entry>
</feed>